関数型プログラミング言語Haskell Part17

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2012/01/02(月) 22:19:49.55
関連書籍
・Introduction to Functional Programming Using Haskell (2nd ed.)
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0134843460/

・Haskell: The Craft of Functional Programming
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0201342758/

・The Fun of Programming
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0333992857/

・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0521644089/

・入門Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4839919623/

・ふつうのHaskellプログラミング
 ttp://item.rakuten.co.jp/book/4052963/

・Programming in Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0521692695/

・Real World Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0596514980

・関数プログラミングの楽しみ
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4274068056
3デフォルトの名無しさん:2012/01/02(月) 22:20:17.30

 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける
4デフォルトの名無しさん:2012/01/02(月) 22:20:18.07
関連リンク
・GHC Wiki
 ttp://hackage.haskell.org/trac/ghc/wiki/TitleIndex

・A History of Haskell
 ttp://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/

・関数型関連の用語集
 ttp://sky.zero.ad.jp/~zaa54437/programming/concepts/

・本物のプログラマはHaskellを使う
 ttp://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/?ST=ittrend

・Haskell API search Engine
ttp://www.haskell.org/hoogle/

【簡単な使い方】
1.検索バーに関数名を入れて検索
 例 map
2.検索バーに型名を入れて検索
 例 (a -> b) -> [a] -> [b]
5デフォルトの名無しさん:2012/01/02(月) 22:22:49.08
Real World Haskell
http://book.realworldhaskell.org/read/

Learn You a Haskell for Great Good!
http://learnyouahaskell.com/chapters
6デフォルトの名無しさん:2012/01/02(月) 22:36:27.61


あれから新しい本も仲間入りしたし、新版も出たから、追加しとくわ

・Haskell: The Craft of Functional Programming (3rd ed.)
http://www.haskellcraft.com/craft3e/Home.html
http://www.amazon.co.jp/dp/0201882957/

・Learn You a Haskell for Great Good!
http://learnyouahaskell.com/
http://www.amazon.co.jp/dp/1593272839/
7デフォルトの名無しさん:2012/01/03(火) 10:48:00.13
>>999
>関数型言語って、スパゲティになりやすい。
>宣言的で1つ1つ完結しているから理解しやすいとか馬鹿が言うけど、
>実際には宣言的だからこそスパゲッティコードになる。
モナドの観点からは、これに対してどう答えるんだろか?
8デフォルトの名無しさん:2012/01/03(火) 10:51:34.50
前から思ってたけどおまえ質問下手すぎ
9デフォルトの名無しさん:2012/01/03(火) 11:59:31.93
手続き型言語で言えばクラスに分割せずにmainに詰め込んだほうが色々飛ばなくて判りやすいというのと同じ類のいちゃもんだな
10デフォルトの名無しさん:2012/01/03(火) 11:59:52.07
質問が下手なのは質問じゃないからだろうな
脳内では結論決まってんだろ?
11デフォルトの名無しさん:2012/01/03(火) 12:03:01.20
自分ではわからないだろうけど、バカが書くからスパゲッティになるんだよ
12デフォルトの名無しさん:2012/01/03(火) 12:03:16.47
本当に「宣言的」なら理論的にはスパゲッティになりようがない

先ほども言ったが、スパゲッティというのは実行順序や計算順序が複雑に絡まること
(ここで言う絡まるというのは、解の導出過程を追うとコード上を脈絡無く飛び交ってしまうこと)

完全に宣言的なものには解を導くのに計算順序という概念がない
だから、順序があるのはそれが手続き的な面を少なからず持ってるからだ
(完全に宣言的なもの、HTML や Alloy の記述などはもうプログラムとは呼べないと俺は思う)

Haskellの持つ宣言的な性質は、例えば、参照透過性ゆえに
関数をどこで使用しても同じ結果が得られることに現れている
しかしHaskellだって完全に宣言的ではないから、
計算順序をしっかり意識しないといけないケースがある

ただその場合も、順序を意識して計算を追うのはCやJavaなどよりも楽になるケースが多い
関数をどこで使用しても同じ結果が得られると言うことは、
その結果を知っているなら、それ以上その先深く計算を追う必要が無いからだ

そしてその結果を知る事も比較的容易だ
関数の結果が引数以外の外部環境(変化するクラスのメンバ変数など)に依らないから、
単に計算対象の値に問題の関数を適用して結果を調べればいいだけ(内部計算は知る必要が無い)

実際問題として、Haskellのプログラミングは正直なところ言うほど単純ではないが、
それでもそのようなHaskellの持つ宣言的な性質の部分を大いに活用できるから、
手続き寄りなCやJavaなどよりも理解しやすいと言われるし、俺もそう感じる
13デフォルトの名無しさん:2012/01/03(火) 12:09:39.97
モナドのうち手続き的な処理のための奴は、元を辿ると、意味論の研究にたどりつく。
手続きの意味を明確にするべくデザインされたものが「スパゲティになる」とか、
意味不明の主張だと思うな。
14デフォルトの名無しさん:2012/01/03(火) 12:44:04.80
JavaやJavaScriptでも宣言的なプログラミングを目指してるのにねぇ…
15デフォルトの名無しさん:2012/01/03(火) 12:44:46.52
>>12
本当にHaskellでプログラム書いたことある?
Haskellで実用的プログラミングをしたら、計算順序を意識せずにはいられないよ。

lazyゆえにどれだけメモリリークが発生しやすくなっていると思う?
計算順序のチューニングなしにどうやってメモリリークに対処するんだ?

「計算順序とか関係なく、各宣言を独立に扱える」とか綺麗事逝ってるうちはいいが、
ひとたびリアルタイムなレスポンスを要求されたり、
長時間メモリリークなしに継続的に動作することを要求されたら
どれだけスパゲッティと格闘しなければならないか、理解してるか?
16デフォルトの名無しさん:2012/01/03(火) 13:02:00.83
スパゲッティはちょっと表現が違うと思うが…
17デフォルトの名無しさん:2012/01/03(火) 13:03:37.88
超高性能なプリプロセッサの域を出ない
18デフォルトの名無しさん:2012/01/03(火) 13:10:19.95
計算順序をゴチャゴチャやり始めたらモジュール性もクソもなくなる。
構造化による問題の局所化ができないのだから、スパゲッティーと言っていいな。
19デフォルトの名無しさん:2012/01/03(火) 13:20:09.04
>>12
>(完全に宣言的なもの、HTML や Alloy の記述などはもうプログラム
とは呼べないと俺は思う)
プログラムと呼ぼうと呼ぶまいと、やることができれば、それが一番
いいんじゃないの?
しかし完全に宣言的ってあり得るか?
20デフォルトの名無しさん:2012/01/03(火) 13:27:25.02
どんな言語も土方さんに渡せばスパゲティーを作ってくれるよ
21デフォルトの名無しさん:2012/01/03(火) 13:35:20.53
>>15
もちろん日常的にHaskellでプログラムを書いている
実用的かどうかはそのアプリケーションを利用する環境に依るから何とも言えん
ただ、私(たち)が社内用に作ったアプリケーション、たとえば
意思決定支援システムのようなものは社員達に活用していただいている
ユーザーや外部環境とアルタイムにコミュニケーションするアプリケーションも作ってる

Haskellも計算順序を意識する必要があるケースがあると言ったはず
私はその計算順序がスパゲティになりにくいと言った

少なくとも私(たち)の作るアプリケーションの類では、
遅延性が原因のメモリリークは、C などのより厄介なメモリリークよりも潰しやすい
正確に言えば、アプリケーションの運営に問題にならない程度にまで潰すのは
C などに比べて用意であることの方が圧倒的に多い

申し訳ないが、こればかりは普段皆さんがどれとぼメモリリークを気にしているのか知らない
完全にゼロになる(どういう状態がメモリリークゼロと言えるのかも知らんが)まで、
ひたすら潰し続けるということを私は仕事でやったことがないから

もしかしたら、24時間356日正しく動き続けることが求められるアプリケーションでは、
遅延性が原因のメモリリークはとても厄介な存在かも知れん

逆に貴方はHaskellでどのようなアプリケーションを作った時に、
どのような部分に遅延性が原因のメモリリークが発生し、
それをどれくらい潰そうとして、それとどのように格闘して解決したのか、
ぜひ訊かせていただけないだろうか
2221:2012/01/03(火) 13:38:21.21
>>21
すまん

> 私はその計算順序がスパゲティになりにくいと言った

なりにくいとは言ってないな(頭にはあったが、言葉にはしていなかった)

計算順序を追うのがCなどに比べて楽になるケースが多いと言った
23デフォルトの名無しさん:2012/01/03(火) 13:59:12.54
計算順序厨は1+2+3は1+2が先でなければならない、とか考えるんかねぇw
2421:2012/01/03(火) 14:02:04.92
>>23
>>15 は君のような大馬鹿ではないから、
そういう計算順序を言っているのではないと思うぞ

その計算のどこにメモリリークが発生する余地がある?
25デフォルトの名無しさん:2012/01/03(火) 14:15:22.38
最近の小学校ではかけ算の順序厨がいるらしい
26デフォルトの名無しさん:2012/01/03(火) 18:35:13.10
>>21
>もちろん日常的にHaskellでプログラムを書いている
>意思決定支援システムのようなものは社員達に活用していただいている
うーん。Haskellだろうとそれは大変だろ。
あんた以外がメンテすることはできるの?
2721:2012/01/03(火) 18:51:51.64
>>26
私(たち)と書いた
今は私含めて4人でプログラムして同じ4人でメンテしてる
社内ツール専門の部署だ
28デフォルトの名無しさん:2012/01/03(火) 19:00:01.64
いいなー楽しそうだなー
29デフォルトの名無しさん:2012/01/03(火) 19:18:16.88
>>27
なるほど。
やろうと思えば1人でもできるのか?
30デフォルトの名無しさん:2012/01/03(火) 19:53:23.08
>>21
意思決定支援か。こっちも似ていて、機械学習系のシステム。
大規模行列を扱う時にメモリに抱え込む実装になっている。
サーバプロセスとして実装したから、24-365まではいかないが、
数ヶ月は走り続ける必要がある。

大変だったのは、サーバプロセスのメモリリークかな。
行列への書き込みからメモリリークを取るのは簡単な話だが、
サーバプロセスとして継続的に走り続けるから、
障害回復のためのジャーナルへの書き出しとか、
サーバプロセスに付随する色々な処理に非正格な処理が混ざると
メモリリーク祭りになる。

もちろんCで実装するのに比べれば対処は容易だ。
でもそれはGCの恩恵であって、lazyさや参照透明の恩恵とは違う。
GC付きのOOPLのほうが単純に実装できるかもしれない。
証券系でMLが好まれるのは、そのあたりが理由かもしれんと思った。
3121:2012/01/03(火) 20:06:54.03
>>29
制作時の話なら、作るアプリケーションの規模と、かけられる時間と、
私の今の知識や経験の量による

メンテの話なら、私(たち)が仕事で作ったツールのソースは、私一人でもできる
4人でメンテしてると言っても、そのつど責任者をゲームで一人決めて(押しつけて)、
その人がメインでメンテ、あとの3人は時々サポートするくらいだから

>>15
それはそうと、「計算順序とか関係なく、各宣言を独立に扱える」
本当にそんなことを言っているHaskellプログラマはちょっと問題がある
俺のことを指摘したのなら勘違いだろ、そもそも俺はそんなことは言ってない

「各宣言を独立に扱える」事を臭わすような発言はしたし
事実そういう利点を常に意識しているが、
それが「計算順序と関係なく」できるとは全く思っていない

計算順序はちゃんと意識しないとデバッグ時に計算が追えない
が、「各宣言を独立に扱える」ことにより、計算を追うデバッグの仕事が
Cなどに比べて楽になる、という意味の発言はした(理由も言った)

デバッグにおいて、「各宣言を独立に扱える」ことの別の利点もある
一連の計算に利用するそれぞれの関数を独立してデバッグできる
その関数の規模が小さいほど、みんなでデバッグしやすい(私たちは4人でデバッグしてる)
32デフォルトの名無しさん:2012/01/03(火) 20:11:26.98
>>30
あまりよく知らないんだが、実用システムではメモリリークってそんな
に問題なのか?
それと比べると、lazyさや参照透明の恩恵は実感としてどのくらいなんだ?
3321:2012/01/03(火) 20:15:26.32
>>30
では私と扱っている分野が違うのだろう

私はそのような走り続けるアプリーションをHaskellで作った経験がゼロなので、
私(たち)のアプリで実感したHaskell利点が、貴方のタイプのアプリでも通用するのか、
全く分からない(いずれ必要になった時には当然検証するが)

申し訳ないが、私は私の経験でしかHaskellの利点や欠点を語れない
そちらの分野は私の勉強不足だ

分野が違うことによる意見の相違のようなので、
私はもうこの辺りでフェードアウトしたい
34デフォルトの名無しさん:2012/01/03(火) 20:16:59.85
>>31
そこで言う関数の規模とは、一体どういう意味での規模なのか。
俺自身が触ってきたコードから言うと、
筋のいいOOライブラリのメソッドと関数型言語の関数定義は
同じぐらいの粒度だと思う。行数も同程度。もちろんJavaじゃないぞ。
35デフォルトの名無しさん:2012/01/03(火) 20:25:45.57
>>31
面白い述懐だな。宣言性、計算順序性、独立性、関数規模、デバッグ容易性・・・
「各宣言を独立に扱える」というのは、「関数間にまたがってまで計算順序を
意識する必要がない」とようないう意味だね?
36デフォルトの名無しさん:2012/01/03(火) 20:46:59.65
>>34
その筋のいいOOライブラリが何なのか教えてください
3721:2012/01/03(火) 21:27:08.07
>>35
> 「関数間にまたがってまで計算順序を意識する必要がない」とようないう意味だね?

こちらこそ、なるほどなと思わせる解釈だが、私の言いたかったことは半分正解

当然ながら計算を追うには複数の関数を跨がないといけない
関数Aの中で関数Bと関数Cを使っていたら、
関数Aの最終的な値が「計算される仕組み=計算過程」を知るには
関数Bも関数Cも計算を追わないと絶対にわからない

ただ、関数Bや関数Cは(関数Aのlet節やwhere節で宣言されたものでないかぎり)
普通は関数Aの環境からは独立しているはずだ
もちろん互いの環境とも独立しているはず

であれば、関数Bの計算は、関数Cの計算とは全く関係ないはずだ
参照透過性ゆえに「自動的に」そうならざるをえない

なので、たとえば関数Bのデバッグは関数Cとは独立して行える
これが「各宣言を独立に扱える」ということ

関数Aの計算過程を追うには関数Bや関数Cを跨ぐ必要があるが、
関数Bや関数Cの計算過程を追うには関数間をまたぐ必要がない
だから(私が言いたかったことに関しては)半分正解

ちなみに、関数Bの戻り値に関数Cを適用すればまたがるだろという意見もあろうが、
それでも関数Cを計算する仕組みは変わらない
関数Cを引数の値によって計算そのものを変える事もできてしまうが、
そこまで行くと筋の悪るすぎるHaskellプログラムだから論外だ
38デフォルトの名無しさん:2012/01/03(火) 21:39:32.21
まとめると
・参照透明性はすばらしい
・遅延評価は糞
ということでよろしいか
3921:2012/01/03(火) 21:43:24.13
>>34
> そこで言う関数の規模とは、一体どういう意味での規模なのか。

期待させたのなら申し訳ないが、大した意味は全く無い

言葉が足りなかったな
その関数の規模が小さいほど、みんなで「そろって」デバッグしやすい
というニュアンスで言いたかったんだ

貴方がOOの例で言った関数の規模ときっと同じ意味だ
中でどれほど長い式の計算をしているか、という程度の曖昧な意味だよ

一つの関数内で where 節などでたくさん内部関数を宣言してたりして式が大きいと、
その関数を複数人でデバッグするということは、現実的になかなか難しいからね
いくつかの外部の小関数に分けてあれば、それぞれの小関数をみんなでデバッグできる

もちろん、各小関数が独立しているからこそ、みんなでデバッグができる
40デフォルトの名無しさん:2012/01/03(火) 21:47:23.46
>>37
基本的に了解なのだが、
>関数Aの中で関数Bと関数Cを使っていたら
この場合でも,関数Aの計算過程は関数Bのそれと関数Cのそれから
独立だよね?(細かい確認でスマンが)
4121:2012/01/03(火) 22:03:55.69
>>40
すまん、いつも言葉が足りなくて誤解を与えてしまうな

「関数Aの計算過程を知る」の定義によるだろうね

>>37 では、内部で使ってる関数の内容も含めて関数Aの計算過程と暗に定義していた
だから独立はしてなくて、関数Bや関数Cも知らないとね、と

内部の関数は含めず、純粋に関数Aの中での式を知るという定義なら、独立している
きっと >>40 はこちらの意味で受け取ったんだよね
42デフォルトの名無しさん:2012/01/04(水) 03:24:45.46
>>38
そんな簡単に分けられへん。
43デフォルトの名無しさん:2012/01/04(水) 08:21:01.96
>>38 >42
というかコインの表と裏。
44デフォルトの名無しさん:2012/01/04(水) 11:05:48.35
スレを読みに来て腹減ってしまったがな。 スパゲティ食べたくなった。。。。
45デフォルトの名無しさん:2012/01/04(水) 11:06:26.92
だれか githubからスパゲティなhaskellプログラムさがしてくれ
46デフォルトの名無しさん:2012/01/04(水) 11:15:45.18
Agdaのsrc/full/Agda/Auto/以下がお勧め
47デフォルトの名無しさん:2012/01/04(水) 11:23:18.51
このなかで圏論に手を出してる香具師おる?
48デフォルトの名無しさん:2012/01/04(水) 11:29:39.22
最近出そうして打ちのめされた
基礎からやるならまず集合論でいいの?
49デフォルトの名無しさん:2012/01/04(水) 12:13:15.78
数学で集合論って言うと、ZFC、巨大順序数とかその辺だから、離散数学辺りから。
集合、位相、束、代数、グラフ、論理の初歩をまとめたような本。
列挙したのをちゃんと理解してないと圏論は歯がたたない。

例えば↓が網羅的で練習問題回答がしっかりしてるから独学に向いてる。
http://www.amazon.co.jp/dp/4274130053/
これじゃ初歩的すぎるというのなら推薦図書スレで、
自分の数学能力を話した上で相談したらどうか。
50デフォルトの名無しさん:2012/01/04(水) 12:35:49.88
>>49
あざっす
立ち読みしてみるわ
51デフォルトの名無しさん:2012/01/04(水) 13:12:29.45
>>47
おるよ。なにか話してみてくれ。
52デフォルトの名無しさん:2012/01/04(水) 13:51:46.30
>>48
どの辺りで打ちのめされたのかによるよ

俺は
Conceptual Mathematics: A First Introduction to Categories
http://www.amazon.co.jp/dp/052171916X/

これを読んで、難しかったり、意味が分からなかったり、
納得できなかった部分に出会ったら、その都度他の資料に当たったり、
数学系の掲示板で質問したりしてた

とりあえず古典的な集合の意味が分かって、
単射・全射が分かって、モノイドが分かれば、
圏論の入門書はけっこう読み進められると思う
(圏論の入門書の中でも必要な集合論を必要最小限説明してるし)

抽象的すぎて「飽きる」可能性は大いにあるが
53デフォルトの名無しさん:2012/01/04(水) 13:59:21.34
集合論って前提がほとんどないから
勉強しはじめるには良い分野だと思う
54デフォルトの名無しさん:2012/01/04(水) 14:06:02.43
プログラミング出来るなら概念としては分かってるところも多いしね
55デフォルトの名無しさん:2012/01/04(水) 14:16:07.06
モナドとモノイダル圏って何か関係あるんですか?
join(T^2 -> Tな自然変換)がモノイドになっているっていう話ですか?
56デフォルトの名無しさん:2012/01/04(水) 14:17:40.48
ああ、モノイドは単位元もいるのか…
57デフォルトの名無しさん:2012/01/04(水) 15:51:22.79

           ______
          r〃〃〃 f7⌒ろ)
           l‖‖‖ ||   f灯
            |‖‖‖ ||   | |
            |儿儿儿._」⊥厶
           〔__o____o_≦ト、
.          i / ⌒  ⌒  ヽ )
          !゙ (・ )` ´( ・)   i/
          |  (_人__)    | \
          \  `ー'    /  / ー- 、
.          ,ィ(⊆≧リ≦⊇)〃   /     rク\
.       /   | ̄r少}¨ ̄〃   /    /′ ヽ
      〃 l   |  l| | l| 〃    /     /    └ヽ
     /    l  |l | |l/″   /      !  厂    \
    く,  Y   ! l」fレト!    /       | /        1
    丿  |   | 丿} じ’  /      | /         |
   /     l   | `¨      /      レ′        |

             真の思考停
    (在位 2009年9月16日〜2010年6月8日)

   民主朝の初代考停、言行不一致、虚言、脱税、
   そして外交において巨大な負の遺産を築いた。
58デフォルトの名無しさん:2012/01/04(水) 17:03:46.51
>>52
>圏論の入門書はけっこう読み進められると思う
読み進んでもイミフと思われ
59デフォルトの名無しさん:2012/01/04(水) 17:06:48.83
モナド則ってなんでこんなに遠回しな言い方するの?
[1] (return x) >>= f == f x
[2] m >>= return == m
[3] (m >>= f) >>= g == m >>= (\x -> f x >>= g)
60デフォルトの名無しさん:2012/01/04(水) 17:25:19.49
これ以上ないってほど直球のように見えるが
61デフォルトの名無しさん:2012/01/04(水) 17:27:45.77
>>59
それが「遠回し」と言えるのなら、
遠回しでないもっと簡単な表現に置き換えてみてほしい
62デフォルトの名無しさん:2012/01/04(水) 18:17:34.27
おれは集合論の順序完備化あたりでうちのめされた・・・orz
63デフォルトの名無しさん:2012/01/04(水) 20:55:50.83
>>60
そうか。そういう人もいると思うが、通常そういう人は、「何でも理解しちゃう」
人が多いんだよね。
>>61
簡単な表現かどうか以前に、まずこれとは別の表現は見つかる?
64デフォルトの名無しさん:2012/01/04(水) 21:10:30.32
>>59 は「この表現が理解できない」のではなく、
「なぜ遠回しな言い方をするのか」と訊いている

これは、遠回しではない言い方を知っている上で、
そのような表現ではなく、なぜ敢えて遠回しにするのか、
という意味で訊いているように俺は解釈した

ならば、その遠回しではない言い方に置き換えて表現してみてはくれないだろうか

それとも、俺の解釈が間違っていたか?


ちなみに、俺は少なくともモナド則に関してはこの表現で理解できたから、
別の表現を探す気は起こらない
65デフォルトの名無しさん:2012/01/04(水) 21:46:10.84
具体例を知らないのに圏論だけやってもダメなんだ
66デフォルトの名無しさん:2012/01/04(水) 21:46:16.22
father(son(x)) = x は遠回しに見える。それぐらいの意味だ。
後はなんちゅうことないことだ。
67デフォルトの名無しさん:2012/01/04(水) 21:53:17.25
>>65
だけど圏論によい具体例があまりないんだ。
なにかよい例を知っているか?
圏の例は基本的だが,圏の圏の例がより実践的だと思うが。
68デフォルトの名無しさん:2012/01/04(水) 21:53:23.57
モナド則は、returnと(>>=)で>>59みたいに書くほかにreturnと(<=<)でも書ける

[1] return <=< x == x
[2] x <=< return == x
[3] (a <=< b) <=< c == a <=< (b <=< c)
[4] (a <=< b) . f = a <=< (b . f)

どっちがシンプルに思えるかは人に依るかも
69デフォルトの名無しさん:2012/01/04(水) 22:14:27.60
>>68
こりゃますます常人には分からんな。
スマンが間単に読み方を教えてくれんかな?
70デフォルトの名無しさん:2012/01/04(水) 22:18:57.72
>>69
(<=<)はControl.Monadで定義されてるよ。定義は、
f <=< g = \x -> g x >>= f
71デフォルトの名無しさん:2012/01/04(水) 22:42:02.17
定義なんだからモナド則はこれっていう以上の何が必要なんかわからん。
遠回しもくそもないだろ。
72デフォルトの名無しさん:2012/01/04(水) 22:43:16.38
素直に、モナド則が理解できないから詳しく説明してほしい、と言えばいいのに

表現が遠回しだとか、それこそ遠回しに伺っても、期待する返事は来ないぞ

(まぁ、単刀直入に訊いても、期待する返事が来るとは限らんけど)
73デフォルトの名無しさん:2012/01/04(水) 22:46:17.58
この人は相変わらず質問がヘタだな
74デフォルトの名無しさん:2012/01/04(水) 22:59:11.16
>>71 >>72
この人たちは定義というものはなにかを定義していさえすればよいものだと
思っているらしい。
75デフォルトの名無しさん:2012/01/04(水) 23:02:28.21
マジで何言ってんのお前
76デフォルトの名無しさん:2012/01/04(水) 23:03:18.65
   ∧_∧   
 ( ´∀`)< ぬるぽ
77デフォルトの名無しさん:2012/01/04(水) 23:06:15.65
先月と、先々月の数学セミナーの圏論の歩き方におもいっきり載ってたろ・・・。
78デフォルトの名無しさん:2012/01/04(水) 23:12:52.94
いや同じものを定義するのにも分り安い方法とそうでない方法があるのは普通のことだろ
79デフォルトの名無しさん:2012/01/04(水) 23:14:30.33
>>66
それのどこが何に対して遠回しなのかを説明してくれ
そうすれば、君が >>68 の何に対して遠回しと感じているのか分かるかも知れん

father(son(x)) = x

これは、左辺にある x に対する2個の(この順の)変換が右辺と同等である
という事を示していると思う

このような意味を表すのに father(son(x)) = x を持ち出すのが遠回しと感じるのなら、
君ならどう式で表現するのだろうか?
80デフォルトの名無しさん:2012/01/04(水) 23:24:29.25
せっかく突っ込んで書いてくれたんだから読んでやれよ・・・。
81デフォルトの名無しさん:2012/01/04(水) 23:34:44.98
早くもっと簡潔で直接的なモナド則の書き方書けよ
82デフォルトの名無しさん:2012/01/04(水) 23:48:28.90
>>79
>father(son(x)) = x
>これは、左辺にある x に対する2個の(この順の)変換が右辺と同等である
>という事を示していると思う
うん。だがそれはその式を単にそのまま読んだだけだと思うんだ。
なにが言いたいんだこの式は?何が言えてるんだこの式は?とは思わな
いかい?
まあそういうことなんだが、皆さんイライラしているようだし、この辺
で寝るよ。かまってくれてありがとう。
83デフォルトの名無しさん:2012/01/04(水) 23:55:17.37
f(g(x)) = xという形の等式が直感的に何を意味するかは慣れないと分かりにくい
でも一旦慣れれば問題なくなるし、
この内容を簡潔に表現するにはこの式しかないと思うようになる(f . g = idもあるけど)
モナド則も似たようなもんじゃね
84デフォルトの名無しさん:2012/01/05(木) 00:09:23.77
俺が分からないのはお前らのせいって言いたいだけじゃん。
85デフォルトの名無しさん:2012/01/05(木) 00:22:26.47
>>82
> だがそれはその式を単にそのまま読んだだけだと思うんだ。
> なにが言いたいんだこの式は?

全く逆だ

「x に対して2個の変換 son と father をこの順で適用したものは x と同等である」

という、たまたま今は日本語で表された 「意味」 が何よりも先に先にある
(この意味を人に伝えるには何かの言語で表す以外ないから、たまたま日本語で表した)

この意味を数式という言語で表せば father(son(x)) = x となる
この意味を英語という言語で表せば・・・
この意味をヒンドゥー語という言語で表せば・・・お任せする

モナド則も意味が先にあって、それをHaskellの式で表す方法のひとつとして >>59 がある
他にも >>68 の様に表す方法もあるし、もしその意味を日本語で表すなら・・・

ということだ
86デフォルトの名無しさん:2012/01/05(木) 00:31:08.78
もしかして数学の定義を使って証明したことがないじゃなかろうか?
87デフォルトの名無しさん:2012/01/05(木) 03:04:58.01
関手fmapと自然変換returnと自然変換joinが「モナド」になる
っていうのが一番簡潔で直接的なモナド則の書き方

>>= は \f->\g->join (fmap g f)によって定義できる二次的なもの
88デフォルトの名無しさん:2012/01/05(木) 03:54:01.40
[1] join . join == join . fmap join
[2] join . return == id == join . fmap return
89デフォルトの名無しさん:2012/01/05(木) 14:48:38.07
犬論で拳論でもいいけど、謙論を忘れずに。
90デフォルトの名無しさん:2012/01/05(木) 14:52:37.50
>>49
計算論 計算可能性とラムダ計算
買ってみようと思う。
他におすすめある?
91デフォルトの名無しさん:2012/01/05(木) 14:55:33.27
プログラミングの道具としての圏論ならばalgebra of programming一冊各種証明を手で追いながらみっちりやれば充分
92デフォルトの名無しさん:2012/01/05(木) 15:20:01.29
中古で六万かよ
93デフォルトの名無しさん:2012/01/05(木) 15:49:55.57
>>92
Amazon.com 本店(米)の中古はもっと酷い 916.21 ドル

でも、Amazon.co.uk なら中古が 20 ポンドで売ってる(国際便もあるみたい)
94デフォルトの名無しさん:2012/01/05(木) 17:09:38.32
大学講義の離散数学で単位ギリギリとった俺は>>49くらいがちょうどいいかな
95デフォルトの名無しさん:2012/01/05(木) 17:47:12.97
もしそれが恥ずかしくないのなら、>>49 でもやばいかも
96デフォルトの名無しさん:2012/01/05(木) 17:49:28.01
 ttp://blog.ezyang.com/2012/01/why-iteratees-are-hard-to-understand/

MITの学生さんだって。みな頑張れ
97デフォルトの名無しさん:2012/01/05(木) 17:53:03.61
>>91-3
どうせ大学の図書館探したら転がってるだろうから、みることは可能だろうよ。
98デフォルトの名無しさん:2012/01/05(木) 18:37:14.15
お前らは何百年同じ話を続けるつもりなんだ?
99デフォルトの名無しさん:2012/01/05(木) 18:46:42.96
あと1億年と2000年間
100デフォルトの名無しさん:2012/01/05(木) 18:51:23.55
いや、あと数年で終わらせるから待ってろ
101デフォルトの名無しさん:2012/01/05(木) 19:17:34.36
>>99
8000年過ぎた頃からもっと繰り返したくなった
102デフォルトの名無しさん:2012/01/05(木) 20:56:35.84
>>87
そうだね。
>>86
むしろ定義しか使わん。公式を使ったことはあまりないが。
>>85
>「x に対して2個の変換 son と father をこの順で適用したものは x と同等である」
数学世界の閉じこもりならそれでよいが、それでは世間と話ができんだろ。
>>84
理解できてる、理解できてない、なんてことはまあつまらんことだ。
103デフォルトの名無しさん:2012/01/05(木) 22:02:39.10
85-86への返答からだと、
何を分かってないのか分からんのじゃないかと思う。
104デフォルトの名無しさん:2012/01/05(木) 22:14:39.66
>>102
[1] モナド則の意味をできるだけ平易な日本語で表現してほしいのか、
[2] 単にライブラリドキュメントに書かれたモナド則の表現が遠回しだと言いたいだけか
[3] それ以外の事が言いたいのか

[1] なら素直にそう言え

[2] なら言いたいだけ言っていれば良い

[3] ならハッキリと意思を伝えろ
105デフォルトの名無しさん:2012/01/05(木) 22:18:19.52
この人はもう無理だろ
ネタでやってるとしか思えないぐらい質問が要領を得ない
106デフォルトの名無しさん:2012/01/05(木) 22:49:24.22
定義に従うのもいいけど、定義のないものは徹底的に無視するのも数学では重要だと思う
Haskellの範囲で定義されていないことをわざわざ調べて付け足す必要はない
107デフォルトの名無しさん:2012/01/05(木) 23:04:55.33
モナドじゃないけど、adjunctionの定義は「何が言いたいんだ?」ともどかしかったなあ。
あのhom(FY,X) = hom(Y,GX)という定義式がなぜねじれた形になってるのか、
ずっと疑問だった。
108デフォルトの名無しさん:2012/01/06(金) 10:40:36.54
腐: ホモだから
109デフォルトの名無しさん:2012/01/06(金) 10:59:56.72
ほむほむ
110デフォルトの名無しさん:2012/01/06(金) 12:54:31.23
随伴なんて単なる関手の圏における同型な対象にすぎない
111デフォルトの名無しさん:2012/01/06(金) 15:20:01.72
ttp://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96
圏論知らないなりに↑の説明読んだんだけど、
>モナド は圏から同じ圏へいくつかの追加の構造を提供する特殊な関手
ってところにちょっと引っかかったので2点質問させてください。

1.例えばInt と Maybe Intは別の圏に存在する対象だと読みながら勝手に想像してたんだけど、
この説明からいくと同じ圏に属していると考えてOK?
あるいは、Dまでいかない、C'ぐらいの内部的な圏みたいな概念がもしかして存在する?

2.Haskellにおいて圏から別の圏への変換にあたる操作って、具体的には何なんでしょう?
112デフォルトの名無しさん:2012/01/06(金) 16:06:41.22
1.同じ圏の対象とも別の圏の対象とも考えることは可能。
そのリンク先ではHask圏という、Haskellの型が対象で関数の値が射とする圏を考えているので、
その文脈の限りではIntとMaybe Intは同じ圏の対象だと考えて良い。

2.Functor型クラスがHask圏からHask圏への変換(自己関手)を表現していると考えられる。
class Functor (f :: * -> *) where
fmap :: (a -> b) -> (f a -> f b)
この定義の内、f :: * -> *のところがHask圏の対象である型を、別の型に写像する関数を表現している。
また、fmap :: (a -> b) -> (f a -> f b)のところが射を写像する関数を表現している。
113デフォルトの名無しさん:2012/01/06(金) 16:15:39.92
>>112
ありがとうございます、1については多分納得しました。
2は質問が悪かったです。
自己関手ではなく、明確に別の圏と考えられるものに変換しているような関手の具体例が
Haskellにあれば教えて欲しかったのです。
114デフォルトの名無しさん:2012/01/06(金) 16:31:14.92
普通の型と[a]のようなリスト型が別の圏の対象であると解釈すれば
Functor型クラスが別の圏に変換する関手だ、と考えることもできるよ。
何を圏と考えるかの問題。
115デフォルトの名無しさん:2012/01/06(金) 16:36:15.59
>>114
書いてから、何を圏とするかで変わるよな、とは思ったのですが意図を汲み取って頂けて嬉しいです。
Hask圏で考えると、Haskellにおいて別の圏にあたる概念はなさそうですね(?)。
116デフォルトの名無しさん:2012/01/06(金) 16:45:49.97
>>107
それ俺も分からない。なぜ?
117デフォルトの名無しさん:2012/01/06(金) 16:48:49.32
Hask圏のサブセットを別の圏と考えたりして色々考えることはできそう。
118デフォルトの名無しさん:2012/01/06(金) 20:58:56.44
?一気にレベル上がったな
>>115
よくわからんが、型を集合(Set圏の対象)と考える場合、HaskellのFunctorは
型から型(集合から集合)への対応で、Set圏で完結していると考えられるから
基本無理なんじゃない?
あるとしたら集合からなにか別の対象を構成して圏自体を構成するとか必要になるのじゃないかと思う。
119デフォルトの名無しさん:2012/01/06(金) 21:59:44.43


 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける
120デフォルトの名無しさん:2012/01/06(金) 22:17:19.97
121デフォルトの名無しさん:2012/01/06(金) 22:37:50.72
説明してくれ。
122デフォルトの名無しさん:2012/01/07(土) 01:57:09.16
まだやってんのか?
123デフォルトの名無しさん:2012/01/07(土) 13:33:31.17
>122
Let's join us!
124デフォルトの名無しさん:2012/01/07(土) 14:49:07.40
>>59
[1] flip(>>=) f . return == f
[2] flip(>>=) return . f == f
[3] flip(>>=) g . flip(>>=) f == flip(>>=) (flip(>>=) g . f)
この定義から分かることは
f と g と return には flip(>>=) を適用できること
flip(>>=) f の戻り値の型は f の戻り値の型と同じ (引数の型だけ変わる) ということ

つまり、戻り値の型は変えられないが引数の型は変えられるようなものを表現したいんだと思う
125デフォルトの名無しさん:2012/01/07(土) 15:59:51.70
>>124
うん。勿論[1]-[3]は、>>=やfなどの型についてのそういう制約を前提にして
いるが、[1]-[3]はそれ以上の条件を表現しているよね。
126デフォルトの名無しさん:2012/01/07(土) 16:31:12.63
>>125
== が成立する条件が難しいと思う
f==g なら f の型と g の型は等しいとは思うが、それ以上は難しい
127デフォルトの名無しさん:2012/01/07(土) 23:46:02.70
== を「型が等しい」と解釈するならモナド則は自明
別の意味があるなら == を定義するべき
128デフォルトの名無しさん:2012/01/08(日) 09:04:29.08
>>107 >>110
hom(X,Y) = hom(FX,FY)
129デフォルトの名無しさん:2012/01/08(日) 10:07:40.92
それはほむ関手と普通の関手Fの合成関手
130デフォルトの名無しさん:2012/01/08(日) 10:39:44.40
Y:=(1/F)W
131デフォルトの名無しさん:2012/01/08(日) 11:54:54.22
式だけ書いておけば後は汲みとれるはずだというやつは本当に大嫌いだ。
まさしくクソメン。
132デフォルトの名無しさん:2012/01/08(日) 12:05:09.42
>>131
だからさ、詳しく説明して欲しいのなら素直にそう言えって何度言ったら・・・

説明を求めていないのなら無視しろよ
133デフォルトの名無しさん:2012/01/08(日) 12:08:42.39
ほむの中でFが増殖する気持ち悪い関手
134デフォルトの名無しさん:2012/01/08(日) 12:10:29.13
違うね。これはそういう問題じゃない。
それに無視して暗に黙認を形成することは少なくとも俺には絶対にできない。
そういう表明だ。
135デフォルトの名無しさん:2012/01/08(日) 12:16:57.29
そもそもスレチだ。
136デフォルトの名無しさん:2012/01/08(日) 12:17:54.40
>>134
黙認しないのなら、しっかり質問しろ

お前は「嫌いだ」としかまだ言っていない
嫌いだと表明するだけでは残念ながら何も起きないぞ

式だけ書いておけば・・・と言っておきながら、
その式について何も訊いていないだろ
>>130 にとっては、お前がこの式の何が分からないのかが分からない状態だと思うが
137デフォルトの名無しさん:2012/01/08(日) 12:21:07.73
もう構うなよ…
この人は自分で調べないから絶対に具体的な質問出来ない人だよ
138デフォルトの名無しさん:2012/01/08(日) 12:24:51.53
>>136
何か起こす?そんなの期待してるから何も出来ないんだよ。

そもそも圏論はスレ違いだ。
139デフォルトの名無しさん:2012/01/08(日) 12:32:03.12
別に説明して欲しい訳じゃなくて、>>130のやりかたがコミュニケーションとして酷いといってるんじゃないの
140デフォルトの名無しさん:2012/01/08(日) 12:34:44.10
けんかはやめてくれ。みんな俺が悪いんだから。
141デフォルトの名無しさん:2012/01/08(日) 12:49:17.63
わかればいいが、普段からそんな話の展開をしてるなら改めたほうがいい。
142デフォルトの名無しさん:2012/01/08(日) 13:05:02.48
>>141
不粋だな
143デフォルトの名無しさん:2012/01/08(日) 13:07:29.45
template haskellの機能を使ってモジュール内で定義されてる関数の名前全部取得するような事ができるみたいなんだよ
これをどうやって実現してるかというと、どうやら展開時に自分自身が記述されてるファイルをIO使って読み込んで解析してるらしい
よく聞くコンパイルタイムIOという空恐ろしいものはこうやって使うのかといういい実例だと思ったね
144デフォルトの名無しさん:2012/01/08(日) 13:15:03.18
>>143
template haskell って地味に良い拡張機能だよな
HaskellDB で使って実感したわ


対応した IDE ができるともっと良いが
145デフォルトの名無しさん:2012/01/08(日) 13:20:27.44
まともなIDEがない時点でC以下
146デフォルトの名無しさん:2012/01/08(日) 14:15:39.33
IDE で C と比べたって意味無いよ

IDE で言語選ぶわけじゃないし
147デフォルトの名無しさん:2012/01/08(日) 14:16:43.08
ghc-modじゃ不足でしょうか、、、
148デフォルトの名無しさん:2012/01/08(日) 14:55:26.81
文句あるなら造れ
そして英雄となれ
149デフォルトの名無しさん:2012/01/08(日) 14:56:05.77
IDEで言語選ばないの?
あなたはIDEで言語を選ばないの?
多くの人はIDEで言語を選ばないの?
すべての人はIDEで言語を選ばないの?
150デフォルトの名無しさん:2012/01/08(日) 15:02:26.58
ドカタが仕事にありつける言語にはIDEがある、が正解
151デフォルトの名無しさん:2012/01/08(日) 15:03:00.33
量化を取り除くと自己言及の誤謬に陥るのでNG
152デフォルトの名無しさん:2012/01/08(日) 15:15:52.21
>>147
ghc-mod って、template haskell に対応してたっけ

たとえば、Template haskell のチュートリアルに

-------------------------------
module TupleReplicate where
import Language.Haskell.TH
tupleReplicate :: Int -> Q Exp
tupleReplicate n = do id <- newName "x"
return $ LamE (VarP id)
(TupE $ replicate n $ VarE id)
-------------------------------

という例がある

$(tupleReplicate 2) が a -> (a, a) という型の関数
$(tupleReplicate 3) が a -> (a, a, a) という型の関数
と ghc-mod は教えてくれる?

言っておくが、ghc-mod がクソとか役に立たんと言ってるわけではない
153デフォルトの名無しさん:2012/01/08(日) 15:19:15.80
>>152
やったことないです、、、
@kazu_yamamotoさんに聞いてみルトいいかも
154デフォルトの名無しさん:2012/01/08(日) 15:25:29.61
IDE有る無しで開発効率に影響するのなら、
もちろん言語選択時に考慮するだろ
155デフォルトの名無しさん:2012/01/08(日) 15:27:02.91
統合開発環境の「統合」って、最近流行った「絆」と同じセンスだよね
156デフォルトの名無しさん:2012/01/08(日) 15:36:00.48
C#とかは言語設計段階からIDEと相性良くなるように考えられてると感じる
157デフォルトの名無しさん:2012/01/08(日) 15:40:42.17
>>152
foo = $(tupleReplicate 2)と展開した上で名前に束縛すればfooについて当然型名がかえって来るけど
確かhaskellのインタプリタ(not ghci)が走ってるプロセスを持ってて
バッファの内容を食わせた上で指定した文字列でそいつに問い合わせてるから、
トップレベルで名前を持ってない定義だと上手く参照してくれないんじゃないかと思う
158デフォルトの名無しさん:2012/01/08(日) 15:59:20.60
勝って兜の緒を締めよ開発環境
159デフォルトの名無しさん:2012/01/08(日) 17:11:37.66
>>118
> よくわからんが、型を集合(Set圏の対象)と考える場合、HaskellのFunctorは
> 型から型(集合から集合)への対応で、Set圏で完結していると考えられるから
> 基本無理なんじゃない?

結局は、解釈、モデル化の仕方の問題だけど、
関数以外のArrowクラスのインスタンスを射として考えるならば、
それはHask圏=Set圏の射ではないから、
Hask圏の部分圏と考えることはできない圏を考えていることになる
160デフォルトの名無しさん:2012/01/08(日) 19:13:49.14
震災前

     /::::::::::::::::::::::::::::::;;::ノ ヽ;::\
    /::::::::;;;;;;;;;,,,;;...-‐''"~    ヽ:;::l
     |:::::::::::|    岡田 異音    |ミ|
     |:::::::/     ,,,  ヽ,、   '|ミ|  
     '|:::::::l    '''""   ゙゙゙゙`   |ミ|
       |:::::|.  ,,r ‐、   ,, - 、  |/
     ,/⌒|  ノ ・ _), (. ・ `つ|
     | (   "''''"    |"'''''"  | 
      ヽ,,.        ヽ    |
       |       ^-^_,, -、   |   
         |    _,, --‐''~    ) |  マニフェストもう守れない。どうしよう・・・・ 
         'ヽ  (   ,r''''''‐-‐′ / 


震災後

     |:::::::::/            |ミ|
     |::::::::|   ,,,,,    ,,,,,   |ミ|
     |彡|.  '''"""''   ''"""'' |/
     /⌒|  -=・=‐,   =・=-  |
     | (    "''''"   | "''''"  |  
     .ヽ,,         ヽ    .|  キリッ
        |       ^-^    |
   .     |     ‐-===-   |   大震災が起こったのだからマニフェストの破綻も致し方ありません
         ,\.    "'''''''"   / 
朝鮮民主党
     おわり
161デフォルトの名無しさん:2012/01/09(月) 20:15:30.30
すっごい初心者ですまないんだけど

x=10
x=11

これってHaskellでどう書くの?
162デフォルトの名無しさん:2012/01/09(月) 20:19:11.15
書けない
163デフォルトの名無しさん:2012/01/09(月) 20:36:13.49
>>161
関数型は変数の意味が違うよ。適当な教科書を読んでみましょう
164デフォルトの名無しさん:2012/01/09(月) 20:41:21.78
こう書くんだよ

main = do
let x = 10
let x = 11
print x
165デフォルトの名無しさん:2012/01/09(月) 21:27:31.04
>>164
サンクス
166デフォルトの名無しさん:2012/01/09(月) 23:34:33.20
>>164をこう↓できると思ったんだけど無理だった、何故?
main =
 let x = 10 >>
 let x = 11 >>
 print x
167デフォルトの名無しさん:2012/01/10(火) 00:08:36.44
>>166
do
let ***
###

これは、プリプロセッサで次のように変換される

let *** in do ###

これを踏まえて考えれば・・・
168デフォルトの名無しさん:2012/01/10(火) 07:53:20.13
2-3 Finger Tree を閃いた奴、発想が良いな
169デフォルトの名無しさん:2012/01/10(火) 09:41:18.37
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している

野田内閣は過半数が帰化人

野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は
170デフォルトの名無しさん:2012/01/10(火) 15:47:47.65
>>158
東郷開発環境wwwwwww



って誰か言ってくれると思ったのに。。。
171デフォルトの名無しさん:2012/01/10(火) 19:42:08.90
申し訳ありませんでした

東郷開発環境wwwwwww
172デフォルトの名無しさん:2012/01/10(火) 20:31:46.91
G13型トラクターか...
173デフォルトの名無しさん:2012/01/11(水) 03:08:02.86
東郷開発環境wwwwwww
174デフォルトの名無しさん:2012/01/11(水) 18:47:00.09
論理的な発想ができない連中がなぜHaskellのスレッドにいるのか不思議。
175デフォルトの名無しさん:2012/01/11(水) 18:55:22.75
論理的思考と等式推論を使えることに相関は無い
176デフォルトの名無しさん:2012/01/11(水) 19:22:23.15
>>167
こうか
main =
 let x = 10
 in let x = 13
    in print x

つーかこの式って(>>)か(>>=)を使って表現出来ないの?
副作用にはモナドを使うんじゃないの? わかんないです><
177デフォルトの名無しさん:2012/01/11(水) 19:25:03.27
>>175
勝手に変な方向に誘導するなよ
>>174 は論理的な思考ではなく「発想」と言っている

発想、つまり ヒラメキ☆ だ
178デフォルトの名無しさん:2012/01/11(水) 19:25:13.02
letはλ抽象でモナドを使った式は関数適用
ラムダ計算の項としてみたら全く別物
179デフォルトの名無しさん:2012/01/11(水) 19:32:06.33
>>176
そう

最後の print 関数が副作用を持っている
だから「この」 main関数の型は IO () だ

君はちゃんと副作用にはモナドを使っているんだよ
なにが分からん?

> つーかこの式って(>>)か(>>=)を使って表現出来ないの?

もしかして、こういうこと?

main = return 10 >> return 13 >>= print
180デフォルトの名無しさん:2012/01/11(水) 22:20:24.86

800 自分:名無し募集中。。。[] 投稿日:2012/01/08(日) 22:00:50.04 0
AKBブーム捏造の裏

サウンドスキャンの売り上げでさえほとんどが業者の自社買い他社買いで
資金洗浄した金額がオリコンの枚数×CDの価格って感じかね
http://livedoor.blogimg.jp/dqnplus/imgs/f/f/fff69a26.jpg

181デフォルトの名無しさん:2012/01/11(水) 23:18:15.23
>>176

同じことをC言語で書くとこんな感じ

void main() {
 const int x = 10; {
  const int x = 13; {
   printf("%d", x); }}}

副作用があるのは最後のprintfだけ。
途中のx=13は代入ではなくてたまたま名前が同じ新しい定数の定義。
182デフォルトの名無しさん:2012/01/11(水) 23:52:21.03
Haskellでオブジェクト指向ってどうやるの?
183デフォルトの名無しさん:2012/01/12(木) 07:42:44.45
オブジェクト指向のどの部分を真似したいかによる
(オブジェクト指向を直接的に支援する機構はない)
184デフォルトの名無しさん:2012/01/12(木) 10:52:41.77
HaskellでCを真似しながらCでオブジェクト指向を真似する
間接的ヒラメキ
185デフォルトの名無しさん:2012/01/12(木) 11:51:38.40
186デフォルトの名無しさん:2012/01/12(木) 16:10:46.59


2chやニコニコ動画に民主党から反日工作費が流れていることが知られるようになってきた。
民主党が用意した資金で工作員が2chを荒らしていることもだんだんと知られるようになってきた
187デフォルトの名無しさん:2012/01/12(木) 21:48:47.06
パッケージを cabal install する時に、
ghc にオプションを渡す方法ってありますか?

例えば -XFlexibleInstances とか
188デフォルトの名無しさん:2012/01/12(木) 21:53:26.27
cabal install --ghc-options=-XFlexibleInstances
189デフォルトの名無しさん:2012/01/12(木) 22:08:16.42
>>188
もしかして、cabal install --help で表示それるオプション リストの
--with-PROG=PATH や --PROG-options=OPTS などの PROG って、
ここに ghc や c2hs などのコマンド名を入れろって事か

どおりで --with-PROG=ghc なんてゃってもエラーが出るわけだ

やっと最後に表示されてる
The flags --with-PROG and --PROG-option(s) can be used
with the following programs:
の意味が分かったよ

ありがと
190デフォルトの名無しさん:2012/01/13(金) 12:53:13.89
型変数を伴うシグネチャを持つ関数を、
ある型で特殊化することはできるのでしょうか

たとえば元々 f :: [a] -> a という関数があったとして、
a が Int 型の時は別の計算をさせたいから f :: [Int] -> Int
という型の「同名の」関数も欲しい場合です

下記のように型クラスを作るしか方法はないでしょうか
そうすると、Int 型以外の型にも全て
インスタンスを宣言しないといけないので大変です

class F a where
f :: [a] -> a
f = 汎用的な計算

instance F Int where
f = 特殊な計算

instance F Bool
instance F Char
・・・
191デフォルトの名無しさん:2012/01/13(金) 13:59:50.39
OverlappingInstances拡張を使って、instance F a
192質問です:2012/01/13(金) 18:40:35.10
モナドのデータ m a と 関数 f :: a -> m b を使って、
モナドのデータ m b を作り出すことがなんで『合成』なの?
193デフォルトの名無しさん:2012/01/13(金) 18:47:24.24
どこでそんな表現が使われてた
194デフォルトの名無しさん:2012/01/13(金) 18:53:11.74
複数の小さいデータを組み合わせて大きいデータを作るなら合成でいいんじゃね
195質問です:2012/01/13(金) 19:01:34.54
>>193 ここです
http://tnomura9.exblog.jp/15241458/
>>= 演算子はMaybe型関数とMaybe型関数を
合成する演算子になる、とありました
196デフォルトの名無しさん:2012/01/13(金) 19:21:57.88
>>=は自然変換joinで自己関手を写像したものだから
Maybe圏からMaybe圏への関手だ、ぐらいの表現で良いのでは
合成と言うのは違う気がする
197デフォルトの名無しさん:2012/01/13(金) 19:32:17.88
>>191
OverlappingInstances拡張がどのようなものか見てきました
http://www.haskell.org/haskellwiki/GHC/AdvancedOverlap

なかなか難しいですね、がんばって解読してみます

ありがとうございました
198デフォルトの名無しさん:2012/01/13(金) 21:08:33.18
2つのモナドm1,m2の合成の自然な定義はあるのでしょうか?
直積?
199デフォルトの名無しさん:2012/01/13(金) 23:01:33.65
さいなら。
200デフォルトの名無しさん:2012/01/13(金) 23:59:10.31
野田改造内閣に早速疑惑浮上

@aritayoshifu 有田芳生
捜査当局が内偵を続けている農水疑惑。詳細な怪文書まで出回っている。3億円の
行方はどこに?

@minorucchu ジャーナリスト 田中稔
野田改造内閣を揺るがす、農水省3億円スキャンダルの怪文書。二人の議員名が浮上。
34分前 webから
https://twitter.com/#!/minorucchu/status/157687110562881537

鹿野と筒井らしい
自公は問責も視野に調査開始だって
201デフォルトの名無しさん:2012/01/14(土) 09:49:15.55
あれだけ他パラダイムをdisりまくったその口で
ハスケルはメタパラダイム言語だとか
ふざけんなってのw
202デフォルトの名無しさん:2012/01/14(土) 09:54:29.57
メタパラダイム言語って言葉の意味が分からないからなんとも言えない
203デフォルトの名無しさん:2012/01/14(土) 10:24:18.99
メタって便利な言葉だよな
204デフォルトの名無しさん:2012/01/14(土) 10:50:14.56
「そろそろパラダイムについて一言言っておくか」ってことだろ
バスに乗り遅れた奴が使う言葉
205デフォルトの名無しさん:2012/01/14(土) 10:54:46.75
マルチパラダイムと言いたかったのではないかと推測してみる
206デフォルトの名無しさん:2012/01/14(土) 11:02:45.90
CでOOPができるしJavaでFPができるだろ
HaskellでOOPもできるんだよ
ただしそのパラダイムの為に設計された言語ではないので
可読性落ちたりするから推奨されないというだけの話
207デフォルトの名無しさん:2012/01/14(土) 11:04:31.60
ぷでゆきさんは1年ぐらい前にマルチパラダイムは幻想とか言ってからそれはないだろうな
208デフォルトの名無しさん:2012/01/14(土) 12:09:55.38
人のいうことを鵜呑みにしていいのかい?
209デフォルトの名無しさん:2012/01/14(土) 16:46:37.25

反日ネット工作員
朝日新聞社→社員約300人
民主党とその取り巻きの資金が入った反日工作会社→数社約450人

朝日新聞の社員は捕まった49歳の編集者を含め新聞記事を書く合間に2chを荒らしている程度とみられているが
民主党が用意した反日工作会社はほぼ24時間体制で工作を行っている
工作範囲は民主党が予め工作費を流している2ch、ニコニコ動画を中心にyoutube、個人のブログなどである。

210デフォルトの名無しさん:2012/01/14(土) 20:55:07.12
政治的なアナザー・ワールドの人がHaskellerってありえないよね?
211デフォルトの名無しさん:2012/01/14(土) 20:59:45.86
あの人、言うことコロコロかわるから。
OOは複雑すぎてわからないと言ってみたかと思ったら
OOはしょせんこの程度のモデルに過ぎないからと言ってみたり
全く参照透明ではないw
212デフォルトの名無しさん:2012/01/14(土) 21:44:45.71
>>206
推奨されないと言われても
禁止されているようなものだと思うか、禁止されていないと思うかで全く違う
推奨なんて中途半端なことをするから解釈がコロコロ変わる
213デフォルトの名無しさん:2012/01/15(日) 00:17:59.85
>>211
発言を時間の関数と思えば参照透明。
これがHaskell流だ
214デフォルトの名無しさん:2012/01/15(日) 08:56:17.00
>>201
「メタパラダイム言語」という言葉は、このスレが初出です。
「Haskellはメタパラダイム」というtweetの話をしているんですよね?

Haskellは○○
http://togetter.com/li/241437
>Haskellはメタパラダイム  tanakh 2012/01/13 17:38:41

もともとtanakhは「モナドはメタパラダイム」と主張しているので
モナドを取り込んだHaskellもメタパラダイムと考えたのでしょう。
モナドが様々なパラダイムを実現できると主張する事と
有用でないパラダイムをディスる事は別に矛盾してないのでは?
215デフォルトの名無しさん:2012/01/15(日) 12:31:26.23
民主党が惨敗した参院選直前の政党支持率(2010年7月11日投票)

FNN 2010年7月4日
民主党 29.9% 自民党 16.3%
ttp://sankei.jp.msn.com/politics/policy/100706/plc1007060530003-n1.htm
ttp://www.fnn-news.com/archives/yoron/inquiry100705.html

マスコミに、ダマされるなよ。

216デフォルトの名無しさん:2012/01/15(日) 14:30:28.52
VIPからきました
何から始めるんでしょうか
217デフォルトの名無しさん:2012/01/15(日) 14:44:29.28
テンプレ読むところからだろ。
218デフォルトの名無しさん:2012/01/15(日) 14:45:25.41
そりゃもっともで
読んできます
219デフォルトの名無しさん:2012/01/15(日) 14:51:53.71
なんでvipから来た奴ってわざわざ名乗るんだろうな
220デフォルトの名無しさん:2012/01/15(日) 14:54:38.77
>>219
vipperだから
221デフォルトの名無しさん:2012/01/15(日) 16:57:17.93
>>214
有用でないという証明がまるでできてないのに?
根拠らしきものは、難しくて理解できない、って発言ぐらいだけど…
222デフォルトの名無しさん:2012/01/15(日) 17:00:31.21
それ以前に逐次実行モデルっぽいことができるだけでメタパラダイムとかw
その理屈だとチューリング完全な言語はみなメタパラダイムになるぞww
223デフォルトの名無しさん:2012/01/15(日) 17:30:52.32
「モナドは値レベルでメタプログラミングをするための手段」
っていうのは適切な表現だと思うけどなぁ
継続や動的スコープが欲しくなったら処理系に手を入れずともモナドで実現できるわけだし
モナド変換子でそれらを組み合わせることもできる
224デフォルトの名無しさん:2012/01/15(日) 17:54:23.52
>>221
他パラダイムが有用でないという判断がでたらめでも
「Haskellはメタパラダイム」は別に矛盾しません。

>>222
「メタパラダイム言語」の次は「逐次実行モデルっぽいことができるだけで」ですか。
ソースを示さずに捏造を繰り返している事を自覚してください。

tanakhがモナドで逐次実行モデル以外も実装できると主張しているソース
http://tanakh.jp/pub/unisys-tech-2011-11-09.html#37
>モナドから見た命令型
>計算コンテクストの1つに過ぎない
>その他:
> ・論理型
> ・オブジェクト指向
> ・アスペクト, etc…
>これらはモナドのコンテクストとして実装できる
225デフォルトの名無しさん:2012/01/15(日) 18:53:37.75
チューリング完全な言語なら
どんなパラダイムだって実装できる
226デフォルトの名無しさん:2012/01/15(日) 20:41:23.81
>>225
モナドを使えば後付けのパラダイムを言語に取りこめるという話でしょう。
Lispのマクロでもできますが、チューリング完全だけでは無理です。
227デフォルトの名無しさん:2012/01/15(日) 21:05:04.33
パラダイムを言語に取り込めるとやらの定義は?
つーかモナドなんて手続き型言語でも簡単に実装できるが、Haskellを特別視する理由は?
まさかdo構文(ただの構文糖)の有無を特別視してるのか?
228デフォルトの名無しさん:2012/01/15(日) 21:26:47.75
bindはクロージャが無いと無理だし、静的型付けの言語でreturnを多相にするなら型クラスが居るよね
229デフォルトの名無しさん:2012/01/15(日) 21:34:13.26
俺は >>226 ではないが、言いたいことはわからんでもない。
要は抽象化の問題だろ。
手続型がどうとか言う話じゃない。

あるパラダイムをモナドの中に押し込めて隠すことが出来るという意味で「取りこめる」と言ってるんだと思う。
LISP もマクロで覆ってしまえばプログラマはそのライブラリを愚直に使うだけのこと。

抽象度がイマイチな言語でも、もちろん様々なパラダイムに基いたプログラムは書けるけれど、
それはプログラマが意識しながらプログラムを書くということであって、
言語の中に (ライブラリ等として) パラダイムを取込むとは言えないと思う。

ってことだと理解した。
230デフォルトの名無しさん:2012/01/15(日) 22:08:51.73
モナドは全部同じだろ。
具体的なインスタンスを比較しない限り同じに見えるはずだ。それが抽象化だ。
異なるパラダイムを取り込めるのではなく、なぜか同じだから取り込める。
231デフォルトの名無しさん:2012/01/15(日) 22:15:50.51
>>228
静的型付けの言語では、型クラスがないとreturnを多相にできないの?
232デフォルトの名無しさん:2012/01/15(日) 22:24:00.26
暗黙の引数を明示的に与えるようにすれば多相にできるよ
でもそれは、Cでも構造体と関数ポインタ使えばOOPできるよ、というのと同じような話なわけ
モナドをヘビーに使い込むようなスタイルのプログラミングをするなら、Haskellを特別視する理由になるよね
233デフォルトの名無しさん:2012/01/15(日) 22:30:19.48
>>232
型クラスが存在しない静的型付き言語において、
暗黙の引数を明示的に与えるようにする以外の方法では、returnを多相にできないの?
234デフォルトの名無しさん:2012/01/15(日) 22:30:46.35
抽象化をしたいなら特別視なんてやめたほうがいいと思う
235デフォルトの名無しさん:2012/01/15(日) 22:35:55.76
>>233
できないんじゃない?
戻り値の型の情報はどこからとってくるの?
236デフォルトの名無しさん:2012/01/15(日) 22:47:24.22
型というか、型によって選択された実装をどこからとってくるか、だった。ごめんね
多相というのは、つまりoverloading(アドホック多相)のことね
237デフォルトの名無しさん:2012/01/15(日) 22:54:06.87
つまりad-hoc polymorphismを実現する手段として型クラスは必要条件ではないと思った
型クラスはad-hoc polymorphismと型推論を両立するためにless ad-hocにする手段で
型推論を捨てるなりすれば型クラスはなくても多相はできるでしょうと
238デフォルトの名無しさん:2012/01/15(日) 23:29:31.36
モナドであることの利点と型クラスの利点を切り分けられていない人が多い。
モナド則の有難味を感じるのはIOくらい。
239デフォルトの名無しさん:2012/01/15(日) 23:54:42.51
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人

野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は

首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの?
い-6-1
テレビが言えない民主党のスポンサー=韓国北朝鮮
あとはもうわかるよな

240デフォルトの名無しさん:2012/01/16(月) 07:38:13.19
wxHaskell でバイト配列のポインタ (Ptr Word8) から Image 型を作る方法はありませんか
241デフォルトの名無しさん:2012/01/16(月) 07:41:22.96
>>240
すいません、解決しました

Graphics.UI.WXCore.Image や Graphics.UI.WXCore.Draw 辺りばかり見ていましたが、
Graphics.UI.WXCore.WxcClassesAL に望むものがありました
242デフォルトの名無しさん:2012/01/16(月) 08:39:44.77
>>232
> Cでも構造体と関数ポインタ使えばOOPできるよ、というのと同じような話なわけ

Haskellでもモナドと型クラス使えばOOPできるよ、というのと同じような話なわけだね
OOPを簡潔に書けないからね
243デフォルトの名無しさん:2012/01/16(月) 08:43:19.87
OOPと同じ手段は使えないけどOOPで実現したいことは簡潔に書ける(ドヤ
244デフォルトの名無しさん:2012/01/16(月) 09:33:47.83
>>242
今、他の言語がtype classみたいな機能を導入検討中ですぜ?
245デフォルトの名無しさん:2012/01/16(月) 12:01:33.44
>>232
>モナドをヘビーに使い込むようなスタイルのプログラミングをするなら、Haskellを特別視する理由になるよね
「モナド」と「Haskell」を他の組み合わせにすればどんな言語についても言えることだろ。モナド(Haskell)を特別視する理由に全くなってない
246デフォルトの名無しさん:2012/01/16(月) 12:39:05.61
>>232
IOモナドをヘビーに使い込むようなスタイルのプログラミングをするなら、正格評価をする言語を特別視する理由になるよね

こういうことですか?
247デフォルトの名無しさん:2012/01/16(月) 17:11:15.74
多相=アドホック多相だと思ってるハスケル脳は
多相=サブタイプ多相だと思ってるOO脳と同類だな
248デフォルトの名無しさん:2012/01/16(月) 17:29:56.98
Haskellはadhoc多相だけではないので念の為。
249デフォルトの名無しさん:2012/01/16(月) 19:02:10.12
手続き型言語でも簡単に実装できるが、Haskellを特別視する理由、に対する返答なんだからそれはおかしいんでは
モナドの利点は>>223 >>224 >>226など(>>226はモナドというより、後付けでインスタンスを追加できる型クラスの利点?)
250デフォルトの名無しさん:2012/01/16(月) 19:08:13.39
モナドなんか使わなくたって処理系実装すればいいだろ
他パラダイムを実装する枠組みがモナドである必然性はゼロ。
参照透明である必然性もゼロ。型クラスを使う必然性もゼロ。
251デフォルトの名無しさん:2012/01/16(月) 19:12:22.89
材木を見たら釘を打ちたくなる症候群のハスケル厨が
モナドを使って他パラダイムのエミュレートができると気付いただけ

他パラダイムのエミュレートにモナドが不可欠ではないし
モナドが他パラダイムにベストな解法であるわけでもない
単に、モナドで表現すること「も」できるね、ということでしかない

252デフォルトの名無しさん:2012/01/16(月) 22:44:00.17
where や let 内で定義する関数には INLINE プラグマは付けられない?
253デフォルトの名無しさん:2012/01/16(月) 23:07:15.68
モナドは表示的意味論の種々の技法から抽出されたものだから、
計算に本質的なことはモナド的な見方が出来てしまうのですよ。
圏論バカ的な意味合いで。整理するための優れた枠組みなわけです。
254デフォルトの名無しさん:2012/01/17(火) 00:24:32.62
>>253
お前は形容詞バカだ
本質的な、モナド的な、優れたアレがあると言うが名詞が出てこない
255デフォルトの名無しさん:2012/01/17(火) 00:24:57.94
何の説明にもなってないな
256デフォルトの名無しさん:2012/01/17(火) 00:37:55.98
プラグマを処理するときにモジュールレベルよか下のスコープ見てくれるとは到底思えない
257デフォルトの名無しさん:2012/01/17(火) 07:24:50.58
>>256
モジュールレベルというのはどこまでの範囲でしょうか?

{-# LANGUAGE *** #-}
module Homu where

ここまでですか?

それとも、トップレベルの関数定義に対するプラグマも含まれますか?
258デフォルトの名無しさん:2012/01/17(火) 12:27:54.23
モナドは数学に基づくからその辺の言語とは格が違う
1+1=2が否定できないのと同じこと
259デフォルトの名無しさん:2012/01/17(火) 12:38:09.99
唯一のコンストラクタを持つ型の直和が二つのコンストラクタを持つ型と同型であることと同じかなるほどなるほど
260デフォルトの名無しさん:2012/01/17(火) 16:14:17.74
数学に基かないプログラム構成要素なんて存在する?
261デフォルトの名無しさん:2012/01/17(火) 17:08:53.02
孤高なるや否や
262デフォルトの名無しさん:2012/01/17(火) 17:34:33.19
彼にとっては圏論のみが数学なのだろう。
263デフォルトの名無しさん:2012/01/17(火) 17:36:00.52
モナドは圏論に基づくからその辺の言語とは格が違う
f.(g.h)=(f.g).hが否定できないのと同じこと
264デフォルトの名無しさん:2012/01/17(火) 17:42:57.57
で、モナドって言語なの?
265デフォルトの名無しさん:2012/01/17(火) 17:47:59.53
哲学用語
266デフォルトの名無しさん:2012/01/17(火) 18:37:01.81
>>252
付けられるよ
267デフォルトの名無しさん:2012/01/17(火) 19:06:57.29
>>266
初め付けられなかったから訊いたみたんだが、
今再挑戦したらあっさりできた

どうもレイアウトルールに従ってなかったみたいだ
where {-# INLINE f #-} f x = ・・・
なんてのはできないのね

where
 {-# INLINE f #-}
 f x = ・・・
これならできた
ちょっと不格好になるが仕方がない

助かった、ありがと
268デフォルトの名無しさん:2012/01/19(木) 01:16:44.99



 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける
269デフォルトの名無しさん:2012/01/19(木) 22:41:54.05
Float型やDouble型などの、負方向の最大値(無限大ではない)や、
最もゼロに近い正の数などを得る方法は何かないでしょうか
270デフォルトの名無しさん:2012/01/19(木) 23:40:17.17
>>269
Hugs> 1/0::Float
inf
Hugs> -1/0::Float
-inf
Hugs> 1/(1/0)::Float
0.0
Hugs> -1/(1/0)::Float
-0.0
271デフォルトの名無しさん:2012/01/19(木) 23:44:42.25
import Numeric.IEEE
-maxFinite
succIEEE 0
272デフォルトの名無しさん:2012/01/19(木) 23:45:01.08
>>270

>>269 でも言いましたが、無限大ではないです
「計算が可能な」負方向の最大値、正方向の最大値です

あと、最もゼロに近い正の数です
273デフォルトの名無しさん:2012/01/19(木) 23:51:23.95
クラッシュするんじゃ
274デフォルトの名無しさん:2012/01/20(金) 00:02:03.11
>>271
ieee754 パッケージを使うのでしょうか

インストールして、ghci 上で使ってみましたが、
m というモジュールが見つからないというエラーが発生します

今までの経験から察するに、MinGW 用の libm.dll という
dll が必要ではないかと思いますが、合ってますか?

http://gnuwin32.sourceforge.net/packages/libm.htm
ここから辿れるページで探しているのですが、なかなか見つかりません

今日はもう遅いので後日探してみます
275デフォルトの名無しさん:2012/01/20(金) 00:10:16.65
>>271
ごめんなさい、環境を書き忘れていました

Windows7
GHC 7.2.2
276デフォルトの名無しさん:2012/01/20(金) 16:12:27.09
「ふつうのHaskellプログラミング」ってどうですか?評判がいいですが、結構古いので
ほかのにしようかまよってます。
277デフォルトの名無しさん:2012/01/20(金) 16:58:44.68
>>276
一度手続き型言語を修得した人向けで、読後、読み返しにくい

と言うか、今はプログラミングHaskell一択だろう
278デフォルトの名無しさん:2012/01/20(金) 17:00:08.41
ちょっとでも英語読めるならlearn you(ryが初心者向けとしてはベスト
279デフォルトの名無しさん:2012/01/20(金) 17:17:06.71
マセマティカのように
log 6 - log 2 を 誤差なしにlog 3 ときっちり答えてくれるようなライブラリありませんか?
280デフォルトの名無しさん:2012/01/20(金) 19:56:42.13
>>279
logfloat パッケージというものがあるみたいだ

使ったことがないから(インストールする気もない)分からんが、
LogFloat というデータ型で log x を表現するっぽいから、
もしかしたら LogFloat 6 - LogFloat 2 = LogFloat 3 となるかも知れん
281デフォルトの名無しさん:2012/01/20(金) 19:59:20.97
>>280
すまん、紛らわしい間違いをしたな

もしかしたら、logFloat 6 - logFloat 2 == logFloat 3 となるかも知れん
282デフォルトの名無しさん:2012/01/21(土) 01:24:19.13
Learn You a Haskell はもうすぐ翻訳版が出るんだっけ?
まあ英語ならただで読めるんだけど
283デフォルトの名無しさん:2012/01/21(土) 06:03:22.00
>>276
「ふつうの」は、実際に役に立つプログラムを書きながら Haskell を学ぶという
立場で、その方針はよいと思う。誤植も少ない。古いことは気にしなくていいと
思う。

ただし文法の説明はかなりはしょってあるし、網羅的でもない。モナドの説明は
(まちがってはいないが)ごく簡単で、あれじゃわからないだろうと思う。

Wiki の作りかたの話は、省略した部分が多すぎて、本を読んだだけではさっぱり
わからなかった。
284デフォルトの名無しさん:2012/01/21(土) 09:54:12.35
Haskellerがtailコマンドを実装すると
ファイルを全部読み込むクソコードを書くと
教えてくれる良書 > ふつける
285デフォルトの名無しさん:2012/01/21(土) 13:53:02.40
【プログラミング部】 PHPが100倍速で動くようになったぞー
http://awabi.2ch.net/test/read.cgi/poverty/1327050821/
286デフォルトの名無しさん:2012/01/22(日) 11:23:48.95
>>284
> ファイルを全部読み込むクソコードを書く

Haskellが綺麗に書けるって言ってるときは
大抵こんなのばかりだな
287デフォルトの名無しさん:2012/01/22(日) 13:46:53.61
数値リテラルの範囲をコンパイル時に指定できるGHC拡張はないでしょうか

たとえば

newtype NumPadKey = NPKey Integer -- 0 から 9 に限定したい

let a = NPKey 8 -- ok
  b = NPKey 21 -- コンパイルエラー

こういう事をしたい場合は、
0 から 9 までの 10 個の数値が入った NumPadKey 型の値を返す
10 個の関数(num0 :: NumKeyPad など)を作るなどするしかないでしょうか
288デフォルトの名無しさん:2012/01/22(日) 14:19:09.91
TemplateHaskellというGHC拡張を使えばできるよ!
289デフォルトの名無しさん:2012/01/22(日) 14:27:24.57
>>286
コード上は全部読み込んでるように見えて、遅延評価で必要な分しか読み込まれないわけですが・・・
290デフォルトの名無しさん:2012/01/22(日) 14:29:48.48
>>289
headはそれでいけるけどtailだと全部読むよ
291デフォルトの名無しさん:2012/01/22(日) 14:36:41.48
>>290
tail も弱頭部正規形の形までにしか評価されないんじゃないのか?
292デフォルトの名無しさん:2012/01/22(日) 15:10:57.18
なるほど>>284は真実だな
>>289>>291は馬鹿すぎwww
クソ遅せえコードまき散らすなよw
293デフォルトの名無しさん:2012/01/22(日) 15:25:22.29
ハッシュテーブルが確率に依存するみたいに
遅延評価も木構造のバランスが取れている確率に依存するんだよな
294デフォルトの名無しさん:2012/01/22(日) 15:45:23.45
>>291
UnixコマンドのtailはHaskellでいうlastみたいなもん
295デフォルトの名無しさん:2012/01/22(日) 15:58:12.71
>>290
take 10 $ tail [1..]
296デフォルトの名無しさん:2012/01/22(日) 16:06:01.08
>>295
tail"コマンド"だって書いてるだろアホか
297295:2012/01/22(日) 16:08:14.13
ほんとだ、ごめん
298デフォルトの名無しさん:2012/01/22(日) 16:37:21.25
>>292
俺(>>291)も完全に Haskell の Data.List.tail 関数の事だと勘違いしてた

馬鹿すぎで申し訳ない
299デフォルトの名無しさん:2012/01/22(日) 16:43:56.55
何が問題になってるのか、よくわからん。

メモリに全部読みこむのは「ふつうのHaskell」が getContents を
使ってるからで、Haskell 自体の問題ではないよね。

速度の問題なら、後ろからシークしていくのでないかぎり、どうせ全部
読むんだから問題ないはず。これも Haskell とは無関係。
300デフォルトの名無しさん:2012/01/22(日) 16:52:34.31
>>299
どうしてシーク禁止なんて前提にするんだい?
そこを笑われているのに、わかってないんだなw
301デフォルトの名無しさん:2012/01/22(日) 16:54:23.14
もうちょっと冷静に議論したまえ
302デフォルトの名無しさん:2012/01/22(日) 16:59:54.18
処理速度や使用メモリ量を気にするなら、
Haskell でも結局のところやることは変わらないような気がする

System.IO.hSeek で後ろから一バイトずつ戻りながら、改行コードで区切ってく

遅延評価がほとんど活かせず、手続きっぽい実装になるが、
これ以外に良い実装方法が思いつかん
303デフォルトの名無しさん:2012/01/22(日) 17:14:45.72
そんなDQN本だったっけと思って自分も見返してみた

p.50より引用
> tailコマンドの作りかたにもいろいろありますが、今回は次のような方針で実装しました。
> 1. 行のリストを逆順にする
> 2. 先頭からn行を取る
> 3. 取った部分リストをまた逆順にする

実際のコード、同ページのリスト2.9
> main = do cs <- getContents
> putStr $ lastNLines 10 cs
> lastNLines n cs = unlines $ takeLast n $ lines cs
> takeLast n ss = reverse $ take n $ reverse ss

ここまでに使った関数は putsStr, putStrLn, print, length, take, reverse, lines, unlines
アクションが getContents

入門書の序盤のリスト処理の例題としてはこんなもんじゃないだろうかと思う
ふつける擁護とかしても仕方ないので俺ならこう実装するってのがあれば見てみたい
304デフォルトの名無しさん:2012/01/22(日) 17:17:14.40
コードのインデントが崩れたけど見逃して
305デフォルトの名無しさん:2012/01/22(日) 17:26:38.48
>>303
そうだよね。

おそらく「ふつうの」のネタ元と思われる「Software Tools」(ソフトウェア作法、
Fortran 版)にも tail を作る演習問題があって、解答は書いてないけどランダム
アクセスの話よりずっと前に出てくるので、頭から読むことが期待されていると思う。


306デフォルトの名無しさん:2012/01/22(日) 17:26:50.51
>>290
そりゃ、reverse使ってるからな
Haskellは、アルゴリズムを考えないと本当に遅いし、同じアルゴリズムなら、LLなんて比較にならないくらい早いコードが簡単に書ける
(ただし、ghci/runghcではなく、ghcで実行ファイルになったときに限る)
307デフォルトの名無しさん:2012/01/22(日) 17:34:33.10
>>306
じゃあ tail コマンドを実装するにはどういうアルゴリズムが良いんだろ
という話に若干移りかけている
308デフォルトの名無しさん:2012/01/22(日) 17:41:39.84
>>307
うーむ・・・
自分もアルゴリズムにそんなに詳しくないんだけど、10行と言う縛り固定だったり、何行表示するかコマンド引数で取れるなら、last関数を複数回使ったほうが速そうではある
(EOF見つけるまで関数適用の必要ないと推測)

309デフォルトの名無しさん:2012/01/22(日) 18:18:22.72
こういうのもIterateeがもっと整備されてくれば過去の笑い話になるんだろうな。
310デフォルトの名無しさん:2012/01/22(日) 20:17:33.21
必要な行数だけバッファリングしといて、
EOFきたらバッファを全部出力するのが、
メモリ効率的に有利だろう。O(1)で済むので。
getContentsしたらO(n)になってしまう。
常に「指定した行数 >≒ ファイルの行数」ならどっちも同じだが。
311デフォルトの名無しさん:2012/01/22(日) 20:35:54.39
必要な行に辿りつくまでの計算量はどこへ行ったんだ
312デフォルトの名無しさん:2012/01/22(日) 20:45:16.49
unsafePerformIO使っていいんなら、普通にファイルの後ろから読んでできるな。

使わんかったら無理っぽい。俺には無理。
313デフォルトの名無しさん:2012/01/22(日) 20:46:42.49
空間計算量だよ。

seek可能なら後ろから舐めることもできるが、
泥臭いコードになるからチュートリアル向けのコードじゃないな。
314デフォルトの名無しさん:2012/01/22(日) 20:57:18.53
>>313
ああ、必要なメモリの量もO記法で表すのか。ごめん
315デフォルトの名無しさん:2012/01/22(日) 20:58:16.55
seekが制限されると、他の言語でもパフォーマンス出せないと思うが。

316デフォルトの名無しさん:2012/01/22(日) 21:06:37.77
そんなこといちいち書きこむなよ。
317デフォルトの名無しさん:2012/01/22(日) 21:09:34.27
>>312
君の考えた方法で、unsafePerformIO はどこに使うの?
318デフォルトの名無しさん:2012/01/22(日) 22:32:20.73
unsafePerformIOとかhSeekとか出てるんだから、ちょっと考えれば
わからない?

大したコードじゃないよ。5行くらいで終わる。
319デフォルトの名無しさん:2012/01/22(日) 23:01:59.53
>>310

空間計算量なら

takeLast n xs = diff x (drop n xs) where
 diff xs [] = xs
 diff (x:xs) (y:ys) = diff xs ys

みたいなの使えばgetContents使ってもO(1)で済むよ
320デフォルトの名無しさん:2012/01/22(日) 23:04:16.00
>>318
unsafePerformIO って要らなくない?
321デフォルトの名無しさん:2012/01/22(日) 23:08:59.31
unsafeでなくてはならない意味がわからないんですけど。
322デフォルトの名無しさん:2012/01/22(日) 23:18:32.67
>>320
要らない。さっきようやく気づいた。
まだ、Haskellになれてないもので、、、

でも、Haskellっぽく遅延評価で取り出そうと思うと、
unsafe使わざるをえんね。

まぁ、それを意図してるんだろうけど。
323デフォルトの名無しさん:2012/01/22(日) 23:32:52.07
>>319
モナらないと無理。
getContentsの中身はunsafePerformIOなんで。
324デフォルトの名無しさん:2012/01/23(月) 00:13:13.59
unix の tail コマンドなどを Haskell で実装する場合、
もし hSeek 使って逆から読み取ることをするとなると、
読み込むファイルが utf-8 とかだったらどうするの?

今試しに hSeek で戻りながら hGetChar で1文字ずつ取ろうとしたら、
戻るバイト数が分からんかった
325デフォルトの名無しさん:2012/01/23(月) 00:14:23.33
あ、すまん
バイナリモードで読み取れば良いのか
326デフォルトの名無しさん:2012/01/23(月) 02:32:36.04
>>323

ghc7.0.2で試してみたけど最適化なしでも空間使用量は一定だったよ
327デフォルトの名無しさん:2012/01/23(月) 07:08:50.63
>>323
getContentsの中身ってunsafeInterleaveIOじゃないの?
328デフォルトの名無しさん:2012/01/23(月) 07:31:08.49
iterateeやcondoit使っときなさいって
329デフォルトの名無しさん:2012/01/23(月) 10:13:37.62
tailをHaskellで実装する意義が判らん。
初学者でも出来るような事は、Cみたいな言語で充分じゃないの?
330デフォルトの名無しさん:2012/01/23(月) 10:19:33.95
そういう台詞は実際にコード貼ってから言えよ
負け惜しみにしか見えん
331デフォルトの名無しさん:2012/01/23(月) 11:02:10.67
意外と人多いのね、ここ。

実際に役に立つプログラムにすることを考えると、tail コマンドって
$ bzcat backup.bz2 | tail -10
みたいにパイプで使うことが多いから、結局頭から読む版も作る必要があるよ。

教科書でやるなら、素直に頭から読む版を紹介して、ランダムアクセス版は
練習問題にするのがいいだろうね。
332デフォルトの名無しさん:2012/01/23(月) 11:21:41.80
>>329
HaskellでできることをわざわざCでやる必要がないだろ
333デフォルトの名無しさん:2012/01/23(月) 11:52:08.14
わざわざ泥臭いことをやってはいけないという空気に従うのが逆に面倒だな
334デフォルトの名無しさん:2012/01/23(月) 14:22:10.66
具体化できない奴がやたら抽象化にこだわるみたいな
335デフォルトの名無しさん:2012/01/23(月) 19:22:03.97
>>334
そのできない具体化とやたら拘る抽象化の例を挙げてみて

もしかして具体例もなく、なんとなく抽象的にレスしてるだけとか?
336デフォルトの名無しさん:2012/01/23(月) 20:32:55.92
盛り上がってきたね。

別にプログラムなんて好きなんで作ればいいんじゃない?
337デフォルトの名無しさん:2012/01/23(月) 21:10:58.12
>>335
読解力が爆発してますね
>>333へのレスです
338デフォルトの名無しさん:2012/01/23(月) 21:30:27.63
>>309
イテレーティ解説サイト教えてください!(日本語の)
339デフォルトの名無しさん:2012/01/23(月) 21:30:48.60
>>337
だからさ、お前が「〜みたいな」って自分で言ってるじゃん
その抽象的な「みたいな」をもっと具体的に説明してくれよ

じゃないと、それが >>333 の喩えにちゃんとなっているのか、
あるいは >>334 が勝手に喩えていると勘違いしてるだけで、
何も喩えられていないのか、判断に困るだろ
340デフォルトの名無しさん:2012/01/23(月) 21:35:22.98
>>338
「iteratee haskell」で日本語サイトをググってみたか?

たとえば http://d.hatena.ne.jp/mkotha/20111106/1320584724
こんなページがヒットしたんだが



>>337
「具体化できない奴がやたら抽象化にこだわる」事がどういう事か、
自分でもあまりよく分かって(頭の中で整理できて)ないんだろ?
だから、例えばこういう奴とか言って具体例が出てこないんだろ?
341デフォルトの名無しさん:2012/01/23(月) 21:48:59.93
抽象化にこだわってるかどうかは知らんが、
とにかく具体的なコード書く能力が無いのは事実だな
「シーク禁止じゃなければ速いtail書けるんだけど、でも泥臭くなるから……(ぶつぶつ」
とか言いながら実際にはシーク使ったコードは書けない、みたいな
342デフォルトの名無しさん:2012/01/23(月) 21:55:46.74
case of で、あるマッチングと別のマッチングで全く同じ式を計算させたい場合、
どう式を書くのがより合理的なのでしょうか

例えば次のような感じです

data T = A Char | B Bool | C Bool | D Int | E String

f :: T -> Int
f x = case x of
 A d -> g1 d
 B d -> g2 d
 C d -> g2 d
 otherwise -> 0

パターン B b とパターン C d の場合が同じ式になっています

この例の場合、レスの文字数などの関係で g2 d というように関数を適用してますが、
実際は別の関数にするほどでもなく、それでいて短くもないような、
例えば let が2〜3行に in が1行程度の式だったりします

2つのパターンの場合に同じ式を計算する事を分かりやすく示したいのですが、
C言語の switch case のフォールスルーみたいには書けないですよね

コピペのミスなどを防ぐには、この例のように関数にまとめて、
それを呼ぶだけの式にするくらいしか手はないでしょうか
343デフォルトの名無しさん:2012/01/23(月) 22:00:11.07
>>339
具体化=泥臭い=hSeekでシコシコ読み込む方法と、すでに出ていることから察するに、
恐らく>>333へ文句言ってると受け取って、こっちの文意が伝わってないのかなと思った
でも>>339では喩えになっているかって言ってるもんな
何かトンデモないこと言ってしまったんだろうか
たしかに>>334は毒づきすぎたから、そこはごめんなさい
議論の邪魔して失礼しました
344デフォルトの名無しさん:2012/01/23(月) 22:13:40.06
誰かhSeek でスマートに実装したtailください
345デフォルトの名無しさん:2012/01/24(火) 07:56:12.73
>>333
言いたいことは分かるが、ある程度は仕方がない

数回経験すれば自然と分かることだが、
Haskellで泥臭くやると、C言語などで泥臭くやる場合以上に
面倒で、スパゲッティで分かりにくくなり、かつメンテが難しくなる

Haskellで泥臭くやるということは、手続き的な、
つまり計算「順序」に過剰に縛られたプログラムを書くということ
順序に縛られているから計算が一本の長い紐になり、
それがソース上の関数群を複雑に縫い止める

C言語などなら、そこから少しずつリファクタリングし、処理単位の小さくし、
縫い合わされた巨大な処理を細かくばらすことは良くある

でもHaskellでは一度複雑に縫い止めた関数群を少しずつばらすのは容易ではない
計算順序を意識しすぎた為にそうなったのであり、その意識を変えなければ無理
考え方そのものを変えた場合、少しずつ修正するよりは全てやり直した方が早い

そうすると、後で全てやり直すくらいなら、初めから意識を変えて、
計算順序に過剰に縛られないように作ることに意識が向くようになる

初心者のうちは「意識を変えなければならない」という事が面倒でたまらないが、
そのうち「わざわざ」泥臭いことをやってはいけないという意識は消えていく
自然と泥臭いことをしなくなる
346デフォルトの名無しさん:2012/01/24(火) 11:09:18.39
>>345
333じゃないけど、それは自分の実感と全然違うな
Haskellで手続き的なコードを書くのは良くやるけど、
Cでやるのに比べて面倒だと思うことはほとんどない
多次元のmutable配列とかがHaskellだと構文的にごちゃごちゃするくらい

リファクタリングについては、なんでそんな結論に至ったのか理解に苦しむ
局所関数定義と高階関数を自在に使える時点でCとは比較にならない

そもそも「計算順序を意識」するのを止めるだけで関数的に綺麗なアルゴリズムが出てくる訳でもない
時間O(1)のtailを実装するには結局seekするしかないんだよ
347デフォルトの名無しさん:2012/01/24(火) 12:11:52.41
だれかHaskellのスパゲティ屋さんのプログラム見せて
348デフォルトの名無しさん:2012/01/24(火) 12:33:17.39
349デフォルトの名無しさん:2012/01/24(火) 12:34:10.82
>>346
「計算順序を意識」とは言っていない

「計算順序を意識しすぎる」や「計算順序に過剰に縛られた」と言っている

意識しなければ正しい計算ができない事は承知している
350349:2012/01/24(火) 12:49:06.27
それと

> 時間O(1)のtailを実装するには結局seekするしかないんだよ

分かっている
だから私はtailの時間O(1)の実装には一言も触れていない

>>345 では、わざわざ泥臭いことをやってはいけないという空気になりがちな
私なりの理由を述べた(tailの実装といった具体的な対象ではなく一般論)

やってはいけないとは言いすぎだと思うが、アプリの設計開始時から、
または Haskell によるプログラム開始時から
泥臭いことをやってはいけないというくらいの考えでプログラムした方がいいと思う
少なくとも Haskell では

泥臭い事を考えるのは、そうしなければ目標を達成する術が残っていない場合だけ
本当に最後の最後に考える最終手段くらいのもの

本来はもっと抽象度を高める方向に意識を向けた方が良いと思う
例えば seek で1バイトずつ取得したものを文字と解釈して計算するよりも、
getContentsに任せて「ファイルの内容を計算対象にする」方が抽象度は高い

蛇足かも知れんが、ついでに言えば入門書も抽象度を高める考え方や方法を伝授すべきだと思う
351デフォルトの名無しさん:2012/01/24(火) 14:10:06.15
>>350
お前がそういう意見なのは全然構わん
>>345が「Haskellは泥臭いことをやるのには向かない」と
言っているように読めたので反論しただけ
個人的には泥臭いのを嫌がっていては実用コードは書けないと思っているから
352デフォルトの名無しさん:2012/01/24(火) 15:21:05.01
>>348
TX
クラクラ来た。
353デフォルトの名無しさん:2012/01/24(火) 15:36:49.63
>>350
>本当に最後の最後に考える最終手段くらいのもの

最初でも最後でもどっちでもいいんじゃないの
なぜ順序を決めたがるのか
354デフォルトの名無しさん:2012/01/24(火) 16:01:49.74
>>340
あざっす^^
355デフォルトの名無しさん:2012/01/24(火) 19:15:01.19
>>353
俺は >>350 じゃないので横レスになるが、決める決めないじゃなくて、言語の文化としてより自然なやり方はあると思う。
例えて言うなら、日本語は格助詞があるから語順はある程度自由なはずだが、やっぱり自然な語順はあるだろ。
そんな感じ。

やりたい奴はもちろん最初っから泥臭く書いたってそりゃかまわないが、
たいした理由もないのにあえて泥臭く書くのでは Haskell を使う甲斐が無い。
356デフォルトの名無しさん:2012/01/24(火) 20:34:12.21
つまりムダなIO発生させていい気になってるってことねw
トイならそれでもいいけど実用でそれやったらアホだぞ
どれだけキャッシュの無駄遣いすると思ってんだか
357デフォルトの名無しさん:2012/01/24(火) 20:55:06.07
別に抽象度高めつつ、無駄なキャッシュも減らすようにできると思うんだが、
どっちもどっちだな〜。

どっちもあほ。
358デフォルトの名無しさん:2012/01/24(火) 21:08:23.56
>>357
(ふりだしにもどる)
数GBあるログをtailするコードをHaskellで書いてみてくれ
359デフォルトの名無しさん:2012/01/24(火) 21:09:07.58
とりあえず叩き台としてコード書いてみたよ。

tailFile n h = do
 seekable <- hIsSeekable h
 if seekable
  then do
   sz <- hFileSize h
   hSeek h AbsoluteSeek $ max 0 (sz - n)
   hGetContents h
  else do
   takeLast n <$> hGetContents h

takeLast n xs = diff xs (genericDrop n xs) where
 diff xs [] = xs
 diff (_:xs) (_:ys) = diff xs ys
360 [―{}@{}@{}-] デフォルトの名無しさん:2012/01/24(火) 22:17:01.53
http://d.hatena.ne.jp/slayer845/20120123/1327328227
性能は出ているらしい
conduit読めないから俺にはいまいち何やってるか分からんが
361デフォルトの名無しさん:2012/01/24(火) 23:33:17.89
批判組早く
362デフォルトの名無しさん:2012/01/24(火) 23:42:03.26
手続き型の言語による実装と抽象度では大差ないか劣るのではないか
363デフォルトの名無しさん:2012/01/24(火) 23:43:15.57
>>359
行数指定できないから0点
364デフォルトの名無しさん:2012/01/24(火) 23:55:11.19
晒した勇気に100点をあげたい。
365デフォルトの名無しさん:2012/01/24(火) 23:58:01.89
間とって50点
366デフォルトの名無しさん:2012/01/25(水) 00:21:24.87
相乗平均なら0
367デフォルトの名無しさん:2012/01/25(水) 01:31:32.52
行数指定時用のコードを書いみたよ。

なんとなく遅延IO使ってみたよ。Iteratee使えるならそっちの方がいいんじゃないかな。

hGetLinesReversed :: Handle -> IO [String]
hGetLinesReversed h = hFileSize h >>= lazyLoop h [] where
 lazyLoop h rest pos = unsafeInterleaveIO $ loop h rest pos
 loop h rest pos
  | pos < 0 = return [rest]
  | otherwise = do
   hSeek h AbsoluteSeek (max (pos-blockSize) 0)
   xs <- replicateM (fromInteger (min blockSize pos)) (hGetChar h)
   let (hd:tl) = lines (xs++rest)
   (reverse tl ++) <$> lazyLoop h hd (pos - blockSize)
 blockSize = 128
368デフォルトの名無しさん:2012/01/25(水) 02:10:21.02
遅延IOとな
結局unsafe使う以外に方法って見つかってないんだよね?
369デフォルトの名無しさん:2012/01/25(水) 04:13:13.51
普通の getContents とかも遅延IOだけど……
370デフォルトの名無しさん:2012/01/25(水) 06:30:19.08
>367
これを使ってO(1)のtailを作れたら神だな。
371デフォルトの名無しさん:2012/01/25(水) 07:24:35.01
>>368>>367 が unsafe 系を使ってる理由を
「処理速度を出す為」だと思ってるんじゃないだろうか
372デフォルトの名無しさん:2012/01/25(水) 07:57:17.27
>>370
普通に書けばファイルサイズに対してO(1)時間になるんじゃね?
373デフォルトの名無しさん:2012/01/25(水) 21:53:21.47
unsafe使わずに書いてみた。
ファイルサイズチェックしてないので、10行無かったり、小さすぎるのは駄目だけどね。

main = do
h <- openFile "test.log" ReadMode
hGetLinesTail h 10 0 >>= putStrLn
hClose h

blockSize = 128
hGetLinesTail h l pos = do
xs <- hGetContentsSeekFromEnd h pos
if l > (length$lines xs) then hGetLinesTail h l (pos + blockSize)
else return xs

hGetContentsSeekFromEnd h pos = do
hSeek h SeekFromEnd (-pos)
replicateM (fromInteger pos) (hGetChar h)
374デフォルトの名無しさん:2012/01/25(水) 21:58:39.36
すまん。インデントがずれてしまった、、、


main = do
  h <- openFile "test.log" ReadMode
  hGetLinesTail h 10 0 >>= putStrLn
  hClose h

blockSize = 128
hGetLinesTail h l pos = do
  xs <- hGetContentsSeekFromEnd h pos
  if l > (length$lines xs) then hGetLinesTail h l (pos + blockSize)
  else return xs

hGetContentsSeekFromEnd h pos = do
  hSeek h SeekFromEnd (-pos)
  replicateM (fromInteger pos) (hGetChar h)
375デフォルトの名無しさん:2012/01/26(木) 15:33:16.32
その言語の背景にあるパラダイムを上手に活用できればスマートな
プログラムになるだろうけど、
強引に別のパラダイムのものに合わせようとすると悲惨になるのは当然じゃろ?
そのパラダイムに応じた方法を模索していくしかないような。
Haskellって他よりパラダイムが明確なだけに得手不得手があるのは
仕方がなさそうよね。
376デフォルトの名無しさん:2012/01/26(木) 16:55:41.77
Unixコマンドは標準入出力をストリームとして扱う点で
関数型言語のパラダイムと親和性があると思うけどな
Broken Pipe
377デフォルトの名無しさん:2012/01/26(木) 17:41:23.30
>>375
結局、メタパラダイムとかいうのは的外れってことだね
378 [―{}@{}@{}-] デフォルトの名無しさん:2012/01/26(木) 19:26:22.04
Haskellは関数型+手続き型なのでそんなに極端な得手不得手はない
379デフォルトの名無しさん:2012/01/26(木) 20:04:34.51
そんなに極端な得手不得手はないが、悲惨なことになるのか...
380デフォルトの名無しさん:2012/01/26(木) 20:23:58.12
>>376
標準入出力をストリームとして扱うのはインターフェースの部分
内部では tail が代表するように単純にストリームでは扱っていない

関数型は無限リストや継続などでストリームを上手く表現できるが、
今回話題になっている話はインターフェースじゃなくて内部処理の方

正方向で流れてくる情報を逆方向からたどるというのは、
ある意味ストリームとは対極にある処理だと思う

内部処理もストリームにする事に拘るなら、
逆方向にする時にバッファにため込む必要がある
(たまたま Haskell では遅延評価のおかげでそのバッファ処理を自動化できるが)
381デフォルトの名無しさん:2012/01/26(木) 20:33:13.40
正格評価でもバッファぐらい普通にできるが?
382デフォルトの名無しさん:2012/01/26(木) 20:43:46.18
>>381
正格評価ではバッファを普通にはできない、
と言っているように感じたのか

それなら申し訳ない

遅延評価という仕組みを実現するためのGHCの実装のおかげで、
バッファを作らなきゃいけないことを意識する必要がない
という意味で言ったのだ

念のために言い添えておくと、処理速度などの話とは全く別のことだ
383デフォルトの名無しさん:2012/01/26(木) 21:37:21.78
遅延評価とバッファの関係がよくわからないな。
少なくとも>374のコードは再帰するたびに毎回ファイル末尾から読み直してるようにみえる。
行のサイズ = blockSizeのファイルに対して、
tail nを計算するのにO(n^2)の処理を行っているのでは?
384デフォルトの名無しさん:2012/01/26(木) 22:05:50.63
>>383
> 遅延評価とバッファの関係がよくわからないな。

>>374 のコードは今回の私の話とは全く関係ない
>>376 のストリームの話だ

逆順に指定行数を出力するという処理を「ストリームとして処理」するなら、
順に流入してきたデータを全て一時的にどこかに溜めて(バッファ)、
溜め終わってから、そこのデータの末尾から順に流出させる必要がある

そのバッファをどうやって作るか、どうやってデータの出し入れをするか、
ということが問題になるが、遅延評価を実現する仕組みのおかげで、
Haskell(の大抵の実装)ではそれを意識しなくてもできてしまう
上の方のレスで問題視された「ふつける」に載ってる方法だ

getContents 関数から流出した(リストで表現された)ストリームが
reverse 関数に流入してくる

遅延評価の仕組みにより、reverse 関数はリストの内容は評価しない
後で評価する可能性がある未評価のデータはメモリ内に残り続ける
この部分がストリームを逆順にたどるための「バッファ」の役割を果たしている
385デフォルトの名無しさん:2012/01/26(木) 22:51:34.19
>>383
おっしゃるとおり。
とりあえず、unsafe使わずに書けるかやってみただけで効率は良くない。
ついでに、ちょっと間違ってて10行以上取ってきます。
遅延IO使えばもっとシンプルに効率よく取ってこれるよ。

ちなみに、遅延評価とバッファは全く関係ない。
ファイルを逆から読むのにバッファは必要ない。
386デフォルトの名無しさん:2012/01/26(木) 23:11:31.79
>>385
> ちなみに、遅延評価とバッファは全く関係ない。
> ファイルを逆から読むのにバッファは必要ない。

ファイルを逆から読むのにバッファを必要としない方法もあることは分かっている

>>384 で私が言ったのは、「ストリームとして扱う場合はバッファを必要とする」
ということだ

ストリームというのは、パケット通信などのように、
ある塊のデータ群が一列に順に一つずつ流れる、あるいは流すこと

順に流入してきたものを逆順に流出させるには、バッファが絶対に必要だ
そのバッファの仕組みをプログラマが意識して自分で作る必要があるかどうかは別だが

確かに遅延評価とバッファに直接の関係はない
だが、上記の「ストリームの逆順流出」において
遅延評価を実現させる為の内部の仕組みがたまたまバッファの役割を果たす

もう一度言うが、あくまで >>376 のレスを受けて、
「内部処理もストリームとして扱う場合」の話をしている
(それが非効率的な事も分かっている)
387デフォルトの名無しさん:2012/01/26(木) 23:42:32.23
よくわからん。
もしhGetContentsが遅延評価でなく先行評価だったとしたら、
その「ストリームの逆順流出」プログラムはどう変わるんだ?
どっちにしてもプログラムはhead n $ reverse $ ...
なんじゃないのか。
388デフォルトの名無しさん:2012/01/27(金) 00:05:03.45
>>387
> もしhGetContentsが遅延評価でなく先行評価だったとしたら、
> その「ストリームの逆順流出」プログラムはどう変わるんだ?

そんなことは知らん
先行評価だった場合にGHCが内部でどのような実装をしてくるのか俺には分からない

初めの >>380 では端折ったが、>>382 からはずっと、
遅延評価を実現する為に使われている内部の仕組みが、
ストリームとして流れてくるデータ順の逆転という処理において
バッファとして機能することだけを話しているんだが

ちなみに、この目的で内部の仕組みがバッファとして機能するのは、
hGetContents の処理ではなく reverse の処理をGHCが実行ファイルに埋め込む部分だ
389デフォルトの名無しさん:2012/01/27(金) 00:07:50.19
おれは言わんとしてることがわかったけど、
もう少しわかりやすく説明したほうがいいと思うよ。
390デフォルトの名無しさん:2012/01/27(金) 00:20:31.26
>>389
了解した、努力する
391デフォルトの名無しさん:2012/01/27(金) 00:21:30.05
説明ぷりーず。
一応、WHNF簡約やGHCのSTGマシンあたりの実装は理解してるつもり。
392デフォルトの名無しさん:2012/01/27(金) 00:43:19.91
チュートリアルをやってるのですが、最初で詰まってます。
以下のboomBangsという関数定義でチュートリアルのままなのですが、自分の環境だとエラーになります。
どこが間違ってるのでしょうか。ghci 6.12.1です。
Prelude> boomBangs xs = [if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]

<interactive>:1:13: parse error on input `='
Prelude>

どうかよろしくお願いします。
393デフォルトの名無しさん:2012/01/27(金) 00:55:24.00
Prelude> let boomBangs xs = [if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
394デフォルトの名無しさん:2012/01/27(金) 01:05:23.28
動きました。ありがとうございました。
Prelude> let boomBangs xs = [if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
*** Parser:
*** Desugar:
*** Simplify:
*** CorePrep:
*** ByteCodeGen:
Prelude> boomBangs [1,2,3,4,5]
*** Parser:
*** Desugar:
*** Simplify:
*** CorePrep:
*** ByteCodeGen:
["BOOM!","BOOM!","BOOM!"]
395デフォルトの名無しさん:2012/01/27(金) 01:13:49.09
>>391
あんまり難しい話じゃなくて、C言語とかでも、Seekなしで、
ファイルの先頭からシーケンシャルアクセスしかできないとしたら、
最後10行のデータ取ろうと思うと、どうしても直近10行はバッファ
しとかないといけないでしょ?

Haskellは、このバッファを意識しないでも、自動でやってくれる
って言ってるんだと思うよ。

遅延評価がバッファしてるわけじゃないけど、バッファしてるように
見えなくもない。
396デフォルトの名無しさん:2012/01/27(金) 02:26:27.98
Haskellも結局クリーンで美しいカルト言語だったんだお
設計外のことを無理にやらせれて破綻するんだお
397デフォルトの名無しさん:2012/01/27(金) 02:49:49.78
ということにしたいのれすね?
398デフォルトの名無しさん:2012/01/27(金) 03:01:28.89
実際にやってみたけど、「ふつうの」に書いてある元々の「効率の悪い」
tail に 10 GB ていどのファイルを食わせても、5 秒もかからないんだよね。
これが分単位になるのなら考えてもいいけど、そうでなければ簡潔さの
ほうが大事だと思う。

“「効率」についてうんぬんする人々は、たいていの場合主として本番計算に
計算機資源がどのくらい使われるか、という点にばかり着目していて、コンパ
イルしたり、虫取りしたり、その他さまざまなやりそこないをしたりしながら
本番計算にそなえるために消費される人間の時間と計算機の時間を考えに入れ
ていないのである。” (ソフトウェア作法 p.132)



399デフォルトの名無しさん:2012/01/27(金) 03:03:28.54
ごめん、10GB は嘘だわ。10MB ね。
400デフォルトの名無しさん:2012/01/27(金) 03:13:57.42
ちなみに自分は後ろから読む tail コマンドを昔 C (Pascal だったかも)で書
いてみたことがあるけど、
* ファイルが改行で終わる場合と終わっていない場合を分ける
* バッファの先頭から行がはじまっているか、その前からつながっているかを分ける
とか、細かい場合分けがあって、予想したより面倒だった。

401デフォルトの名無しさん:2012/01/27(金) 05:53:27.42
>>395
正格評価でも、明示的にバッファ取らなくても、
パラメータ渡しをバッファ代わりにできますし…
402デフォルトの名無しさん:2012/01/27(金) 05:56:04.14
>>398
> これが分単位になるのなら考えてもいいけど、そうでなければ簡潔さの
> ほうが大事だと思う。

んなこたーない。

> “「効率」についてうんぬんする人々は、たいていの場合主として本番計算に
> 計算機資源がどのくらい使われるか、という点にばかり着目していて、コンパ
> イルしたり、虫取りしたり、その他さまざまなやりそこないをしたりしながら
> 本番計算にそなえるために消費される人間の時間と計算機の時間を考えに入れ
> ていないのである。” (ソフトウェア作法 p.132)

これは数回実行するだけの研究用プログラムについては正しいが、
UNIXのtailコマンドのように1度書かれたソースを莫大な回数実行する場合には
詰められる無駄は詰めたほうがいい。
403デフォルトの名無しさん:2012/01/27(金) 06:59:03.58
正格な評価でも10行分のキューにストリームから一行読んでは突っ込んでいくだけでしょ
別にC言語でも数分で書けるから特にHaskellを使う利点はないよね
404デフォルトの名無しさん:2012/01/27(金) 07:36:42.85
>>401
同じ事を繰り返すが
私は正格評価の事については一言も触れいてない
正格評価ではバッファを意識する必要がある、
なんて私のレスが何処かに書いてあるか?

私は一貫して
・ストリームとして処理するならバッファが必要
・遅延評価を実現する仕組みがバッファとして機能している
この2点しか述べていない

「遅延評価とバッファの関係」を質問されたから、
正格評価の事まで話に絡める必要は無いだろ
別に遅延評価vs正格評価でどちらが有利か戦わせているわけではない

正格評価でも明示的にバッファ取らなくてもいい
と貴方が言うのなら、きっとそうなんだろ
それは私の話とはたぶん関係ないと思うから、
それがどうかしたのか、としか言いようがない

ちなみに、私の話とは別の事として訊くのだが、
> パラメータ渡しをバッファ代わりにする
それはパラメータでバッファを渡しているのではないか?
遅延評価を実現する仕組みでたまたま機能するバッファの方は、
バッファを作っているという意識すら感じずにプログラムできるが

「正格評価+ストリーミング処理+パラメータ渡し」
これでバッファを意識しなくてもいいプログラムを書いてみてくれ
ちょっと興味ある
405デフォルトの名無しさん:2012/01/27(金) 07:46:54.83
引数として先頭トークンと継続を渡せばいいんじゃね?
406デフォルトの名無しさん:2012/01/27(金) 07:49:56.57
>>391

以下の部分で遅延評価とバッファの関係を簡単に述べている
どこの部分の詳細な説明を求めているのか具体的に言ってほしい

>>384
> 遅延評価の仕組みにより、reverse 関数はリストの内容は評価しない
> 後で評価する可能性がある未評価のデータはメモリ内に残り続ける
> この部分がストリームを逆順にたどるための「バッファ」の役割を果たしている
407デフォルトの名無しさん:2012/01/27(金) 08:04:10.58
アホかHaskellでもバッファは意識しろよ
そんなんだからアホ的非効率コードを書くんだよ
408デフォルトの名無しさん:2012/01/27(金) 08:13:37.12
どうでも良くなってきたが、、、

正格評価、遅延評価とかはバッファと関係ないと思います。
というか、バッファされてる時点で評価済みで遅延してない、、、

正格でも遅延でもたぶん同じように書けます。
409デフォルトの名無しさん:2012/01/27(金) 08:23:27.08
手元にある一番大きなプレーンテキストは MySQL のダンプ(1.3GB)だったので,
これを「ふつうのHaskell」版の tail コマンドに食わせてみたが、メモリオー
バーで時間計測できず(笑)。ファイル丸ごと reverse はさすがにないな。

ただ、個人的にはテキストファイルをランダムアクセスするのは(使用言語が何
であれ)プログラムが無意味に複雑化するので反対。sort とかなら高速化の意
味はあるだろうけれど、tail コマンドをそんなに速くしてどうするの、っていう
かんじ。

Haskell なら、このていどでいいはず。これなら本にのせても場所を取らないし、
大きなファイルでも動作する。

import System
dotail :: Int -> [a] -> [a]
dotail n xs = if null (drop n xs) then take n xs else dotail n $ tail xs
main = do {args <- getArgs; cs <- getContents;
  putStr $ unlines $ dotail (read (head args)::Int) (lines cs)}

1.3 GB で 13分だった。Haskell の入出力の遅さを考えればまあまあじゃないかな。

ちなみに同じファイルに対して行数カウント getContents >>= print.length.lines
だと 8分35秒。Java (BufferedReader.readLine 使用) や Perl で同じことを
やると1分40秒から 1分50秒くらい。wc -l コマンドだと 36秒。
410デフォルトの名無しさん:2012/01/27(金) 08:30:16.99
おまいらこのあとは tail -f の実装が待ってますよ
411デフォルトの名無しさん:2012/01/27(金) 10:25:32.57
ふつうに実装するとIO (IO String)が出てくるから
それよりはunsafeでもIO [String]にしたいってことなのか
412デフォルトの名無しさん:2012/01/27(金) 10:39:57.79
System.IO.MMap.Lazy
413デフォルトの名無しさん:2012/01/27(金) 11:12:49.26
tailなんて巨大ログをすばやく確認したい時ぐらいなんだから
いちいち先頭から1行ずつ読むとか糞遅かったら誰も使わんだろ
用途を満たさない物なんか設計してどうする
言語の作法なんて関係ない
414デフォルトの名無しさん:2012/01/27(金) 11:16:44.14
>>410
それは簡単じゃない?
Control.Concurrent の threadWaitRead で待って、サイズが変わってたら
その分を出力するだけでしょ。

415デフォルトの名無しさん:2012/01/27(金) 11:32:02.97
俺がtail使うのはファイルよりpipeのほうが多いな
416デフォルトの名無しさん:2012/01/27(金) 12:06:04.37
ここで問われているのは、
長年GNUがやってきたように、
過去の他人の成果を丸パクリして、
それでも使われるレベルになるのかどうか?
ということだよな
417デフォルトの名無しさん:2012/01/27(金) 12:47:47.33
儲かるレベルにはならないからポジショントークをする人がひとりもいない
という成果に期待しよう
418デフォルトの名無しさん:2012/01/27(金) 14:20:57.31
クソ実装でも十分速いとか言ってる香具師がいるけど、
空読みするファイルが分散fs上に乗ってたら悲惨だなw
419デフォルトの名無しさん:2012/01/27(金) 16:51:25.37
標準だけで教科書的に綺麗に書くようなオナニーは卒業して
仕事でHaskell使っている人が苦心の末発明したcondoitの使い方覚えろよ
420デフォルトの名無しさん:2012/01/27(金) 17:07:01.50
なにそのコンドームみたいなの?
421デフォルトの名無しさん:2012/01/27(金) 17:09:06.72
conduit
422デフォルトの名無しさん:2012/01/27(金) 18:37:45.13
あれだこれだと意見はいろいろあるだろうが、
にコードが出てきたのがなんと言っても尊い。
423デフォルトの名無しさん:2012/01/28(土) 11:33:31.74
>>288
Template Haskell を少し勉強してみたところ、
やりたいことが実現できそうなことが分かりました

例えば次のように引数をコンパイル時に制限できるんですね

f :: Int -> ExpQ
f x | x < 0 = fail "error"
  | otherwise = [| x |]

$(f (-1)) ====> error
$(f 3) ====> 3

このような事を値構築子でできるようにすれば良いわけですね
調べてみます

ありがとうございました
424デフォルトの名無しさん:2012/01/29(日) 09:15:33.67
http://jutememo.blogspot.com/2011/04/haskell-swap-9.html

リストの要素を入れ替えるswap関数は、pythonの方が簡潔なんだな・・・
リストを配列みたいに扱えない言語よりは優位なんだろうけど、そう言う言語と比較するときは配列と比較になるしなぁ・・・
425デフォルトの名無しさん:2012/01/29(日) 09:30:41.60
リストのランダムアクセスは遅いから専用の関数が用意されてないだけ
Data.Sequenceならupdateがあるので簡単
swap :: Int -> Int -> Seq a -> Seq a
swap i j s = update i (s `index` j) $ update j (s `index` i) s
426デフォルトの名無しさん:2012/01/29(日) 09:37:27.18
よく言語Aより言語Bの方が処理(計算)xを簡単に書ける、というけどさ

言いたいことは分かるけど、「具体的な処理」に関して、
処理後に同じ結果が得られる複数の言語間で「簡潔さを比較」する意味って何なの?

>>424 のリストの swap だって、一旦関数にしてしまえば、
あとは Haskell でも同じように簡潔に書けると思うんだが
(それがライブラリの大きな役割の一つだし)

>>424 のリンク先で考察している方法それ自体は面白いし興味あるけどね
427デフォルトの名無しさん:2012/01/29(日) 09:44:58.64
>>426
いろいろな具体的な(既知の)処理を簡潔に書ける言語があれば、
アプリケーション固有の(未知の)処理も簡潔に書ける可能性が高いからだろ
未知の処理だって、なんらかの既知の処理に似ていることが殆どだ
ということを加味すればなおさら
428デフォルトの名無しさん:2012/01/29(日) 09:53:41.16
そりゃ、できることを比較したらどれも同じになるから比較にならんだろ。

言語の比較は、簡潔に書きやすいとかできるコードが速いとか、デバッグ
しやすいとかになるわ。ライブラリだって簡潔に書けるほうが充実させや
すいしな。
429デフォルトの名無しさん:2012/01/29(日) 10:07:36.20
ハスケルのほうが簡単に書ける時には
「ハスケル最強」

ハスケルのほうが煩雑になってしまう時には
「そんな比較意味なくね?」
430デフォルトの名無しさん:2012/01/29(日) 10:15:41.39
>>429
それは、逆も同じだけどね。

ハスケルのほうが簡単に書ける時には
「そんなの意味なくね」
ハスケルのほうが煩雑になってしまう時には
「ハスケル使えねぇ」

用途考えずに比較なんて意味ないね。
431デフォルトの名無しさん:2012/01/29(日) 10:35:32.33
>>427
いや、だから一度関数になってしまえば、「簡潔さはほぼ同じ」になるわけでしょ

最初に比較して言語Aの方が簡潔だった、でも関数にしたから言語Bも同じなった
>>424 の言う「優位な言語」というのは、どの時点で比較したものなの?
仮に言語Bが関数化した結果、言語Aよりも簡潔になったら、言語間の優位さは逆転するの?

そういうことで逆転してしまうのなら、それはその「具体的な処理に関する」
簡潔さの言語間の比較とは言えないだろう
その具体的な処理に被せるインターフェースの部分のおかげで簡潔になったのだから

また、そんなことで逆転したとは言えないのなら、そもそも比較して
言語Aの方が優位だとか言うことの意義が見いだせない
私の経験上、実用的なアプリ内の数多ある個別具体的な処理に関して、
それらを最も得意とする言語(やパラダイム)は複数に分散する
ある特定の処理をするのに言語Aが優位だからという理由で、
そのアプリを作るのに言語Aを選ぶことは、実際のところ滅多にない
普通は自分やチームが得意としている言語であったり、
個別具体的な処理ではなく全体の求められる処理速度やメンテのしやすさなどで決定される

>>428
今の時代、広く使われている言語なら、どの言語でもライブラリは充実している
充実度の差の理由に言語の簡潔さが関わる割合は、比較して議論するほど高くはないと思うが
432デフォルトの名無しさん:2012/01/29(日) 10:58:44.59
ある処理を実験する複数のプログラムを一つのファイルに書いていました。
(初めはファイルを分けるのが面倒に思えたから)

あるプログラムを実験するときは別のプログラムをコメントアウトしたりして。
なので、ファイルのトップには import が大量に書かれています。

実験が終わって、採用するプログラムを一つに絞ったので、
それを正式にちゃんとしたファイルに分けて保存したいのですが、
そのプログラムを実行するのにどの import が必要なのか、
ごちゃごちゃしてて分からなくなりました。

とりあえずそのプログラムだけ別ファイルに移してコンパイルしてみて、
モジュール不足の為にコンパイルエラーが出る度に
import を追加していけばいいとは思いますが・・・(以前も同じ様なことをしてた)

もっと簡単に、あるソースファイル内の識別子を評価するのに不足していて、
かつインストール済みであるライブラリのモジュールの一覧を見る方法はありませんか。
433427:2012/01/29(日) 11:08:59.81
>>431
俺は>>424じゃないけど、関数化の前の話をしているつもりだった

>また、そんなことで逆転したとは言えないのなら、そもそも比較して
>言語Aの方が優位だとか言うことの意義が見いだせない
>私の経験上、実用的なアプリ内の数多ある個別具体的な処理に関して、
>それらを最も得意とする言語(やパラダイム)は複数に分散する
もちろん。でも、実際的なアプリが色んな処理から成っているからこそ、
言語には極端な苦手分野がないほうが良いし、なるべく広範囲のコードを
簡潔に書けるのが良いということになる
たとえばランダムアクセス可能なデータ構造をすごく扱いにくい言語があったら、
その言語で書き易いアプリはかなり限定される

それから、アプリごとに多用される処理の傾向も違う
行列演算中心のアプリもあるし、DBアクセス中心のアプリもあるし、両方やるのもある
434デフォルトの名無しさん:2012/01/29(日) 11:13:25.04
>>432
全部のファイルに全部のimportをコピーして、とりあえずコンパイルを通す
コンパイルが通ったら-fwarn-unused-importsで不要なインポートを一掃
435デフォルトの名無しさん:2012/01/29(日) 11:16:53.53
>>431
長くて読む気しないな。
言語比較なんてナンセンスだと思うが。言語の優劣なんて個人個人で違うし。

関数化すれば0になるかもしれないけど、関数化するまでのコストは?
ライブラリになってないところの、作成コストは?
ライブラリの学習コストは?

ライブラリは十分充実してる?そしたら自分でプログラムなんて書かんわ。
436デフォルトの名無しさん:2012/01/29(日) 11:30:01.60
>>434
なるほど、逆でしたか
不要な import を省いていくんですね

ありがとうございました
437デフォルトの名無しさん:2012/01/29(日) 12:41:36.12
>>431
うーん、同じ処理の関数化の比較は、コードの長さとかだけじゃなく、関数化する際の概念とか手法とかがプログラマ・あるいは初心者に思いつきやすいか?とかの意味でも比較の意味はあると思う。
>>424のURL先ではpythonは配列的にも使えるリストのために、値の交換が得意な配列的な処理になってるけど、配列は配列。リストはリストとして扱う手続き型言語の場合、

1、リストの中身を配列に移す
2、配列で値を交換
3、配列の中身をリストに戻す

と言う処理になる

Haskellだと

>>424の9つの方法の内、初心者にも出来そうな一つ目と二つ目の方法は基本
1.リストを分割する
(iより前のリスト、i、iとjの間のリスト、j、jの後ろのリスト)
2.値を交換した状態のリストとして結合しなおす

という処理になる


438デフォルトの名無しさん:2012/01/29(日) 12:53:23.82
>>437
> 1、リストの中身を配列に移す
> 2、配列で値を交換
> 3、配列の中身をリストに戻す
>
> と言う処理になる

そんな馬鹿なコードを書くのはプログラム初めて1ヶ月とかの初心者だけだろw
439デフォルトの名無しさん:2012/01/29(日) 12:55:50.74
>>438
え、確かにリストのままでも配列的に使えるけど、パフォーマンス的にはこちらは今でも有効だと思うけど・・・
440デフォルトの名無しさん:2012/01/29(日) 13:03:38.33
たった1組のswapにそんなことしてたら大爆笑だよw
441デフォルトの名無しさん:2012/01/29(日) 13:05:40.34
>>437
で、swapの実装という単位で比較した結果、言語Aの方が
関数化する際の概念とか手法とかがプログラマ・あるいは初心者に思いつきやすい
と結論づけられたとして、それからどうなるの?
それが何にどのように、どれくらい活かされる?

例えばHaskellという一言語においてリストをswapするいくつかの方法の中で、
簡潔さ、初心者の理解のしやすさ、計算速度、応用の幅・・・
などで互いに比較しすることの意義は分かる
時と場合によって使い分ける際の自分なりの基準になる

しかし、今存在している言語間で、swap処理などの
抽象度の低い低レベルレイヤーの処理の実装を比較して
優劣を考える意義がよく分からない

せいぜい新言語を作る際に、既存言語を分析する時ぐらいしか、
言語間で比較して優劣を考える意義はなくないか?
442デフォルトの名無しさん:2012/01/29(日) 13:05:46.19
>>440
じゃあ、どういう処理を1ヶ月以上たったらしてるの?
443デフォルトの名無しさん:2012/01/29(日) 13:15:46.01
たまにはArrayのことも思い出してやってください
444デフォルトの名無しさん:2012/01/29(日) 13:17:38.11
>>442
リスト処理を解説する初心者レベルの入門書で
スワップ時にリストの中身を配列に移すなんて方法は、普通は教えない

普通は、双方向リスト・単方向リストの要素がリンクで結ばれていることをまず教える
もしスワップ処理を教えるなら当然その後になるが、
その際はリンクを繋ぎ替える処理で実装する方法を教えるだろう

処理速度云々ではなく、その方が初心者が「リスト処理を理解しやすい」からだ
初心者はリストの特徴を学ぶのが大事だからな

だから、一ヶ月と言わず、初めから配列に移すなんて方法は学ばない
445デフォルトの名無しさん:2012/01/29(日) 13:23:20.30
n回のswap処理をするのであれば、1度配列にコピってからn回swapするだろうが、
たった1回のswapのために配列にコピってswapしてリストを再構築するとか、アホだろ。
446デフォルトの名無しさん:2012/01/29(日) 13:23:33.53
>>441
今はサイト自体(と運営会社)が無くなっちゃったけど、Haskell入門以前という、プログラミング全くの初心者向けのブログ書いてたんだ
(そして、ネット上の友達(プログラミング未経験者)に読んでもらって、理解できるか確認しながら書いてた)

その関係で、PCがどうやって動いてるかも理解できてない人向けの言語を探してたり
そういう意味で、Haskellは割りと有効だとは思ってたんだけど、このswap関数でちょっと心が揺らいでたり
(変数の概念とかも数学から離れていないと言う意味で、数学+α程度の知識でプログラミングできる言語だと思う)
447デフォルトの名無しさん:2012/01/29(日) 13:24:16.02
>>443
Array=配列 ですが、何か
448デフォルトの名無しさん:2012/01/29(日) 13:24:26.38
まーたこれで数日後にRubyスレが荒れるのか
449デフォルトの名無しさん:2012/01/29(日) 13:26:31.49
>>444
ん・・・
それって、結局Haskellのやり方と同じことを手続き型言語でもリストのswapの勉強の際には教えるってこと?
450デフォルトの名無しさん:2012/01/29(日) 13:28:51.88
>>445
何というか・・・
行間嫁よ
そんなの当たり前だろ
451デフォルトの名無しさん:2012/01/29(日) 13:31:51.09
>>448
rubyの場合、リストっぽく使える配列だね
pythonとは名前が逆だけど、実装は何が違うんだろう?
452デフォルトの名無しさん:2012/01/29(日) 13:36:38.70
>>450
はあ?文脈読んでないのはオマエだろ。
>>424のリンク先のコードのswap関数の型を書いてみろよ。
どこをどう見たって、リスト/配列中の1組の値のswapだ。
型情報以上に重要な「行間」があるなら書いてみろw
453デフォルトの名無しさん:2012/01/29(日) 13:45:07.16
>>449
結果としてHaskellのやり方と同じことを初心者には教えることになるが、
そんなことが言いたかったのではないんだ

・一般的にリストと呼ばれている構造をプログラムで表現する方法
・その表現方法の上での、リストに関する様々な演算方法

リスト処理を初心者に教える入門書はこの2点を分かってもらいたくて書いている

Haskell でのプリミティブなリストの表現方法はいわゆる前方参照の単方向リストだが、
概念は他言語で表現されたリストと似ているし、表現方法が同じなら同じ方法が使える

もし swap 処理を教えるとしたら、その概念に沿って教えるのが自然だ
概念から外れた方法を理解させようとしている入門書があるなら、
その入門書は(少なくともその部分に関しては)クソだと思う
454デフォルトの名無しさん:2012/01/29(日) 14:12:10.92
>>452
視野が狭いな・・・
455デフォルトの名無しさん:2012/01/29(日) 14:25:57.63
>>453
リスト専門の入門書ってのは読んだこと無いんだが、もし在るならそうなるだろうね
Haskellでちょっと不便かな?と思ったのは配列も値が変えられないだろうという事。結局、IOモナドなり、Stateモナドなりを頼る事になりそうなのがね・・・
>>425のupdate関数は初心者にも作れるし、意外と有効かも
(全体を2回書き換える事にはなるが、コード上は交換したい値を一つずつ更新してるのは、初心者には分かりやすそう)

最近はリストなんだか配列なんだかという、(コード上の)データ構造の性質がハッキリしない言語が多くなってきたから、楽にはなったけど、データ構造の性質を教えるのにはちょっと不便になってきた気がする
(そう言う意味では、Cとかの方が生々しい意味で最適なのかも知れないが、生々しすぎて初心者には敷居が高いし・・・)
456453:2012/01/29(日) 14:33:26.96
>>449
読み返したら誤解を与えそうな感じがするから言っておくが

一般的なリストの構造とリストの演算を初心者に教える過程で swap を教えるのなら、
結果としてHaskellのやり方と同じことを教えることになる、という事だからな

要素の破壊的な代入が許されるタイプのリストなら、
普通の変数同士のswapのようにテンポラリ変数を使って比較的素早くswapできるし、
そのように解説している入門書もあるだろうが、それは目的が違う
その部分の関しては、リストの構造とリストの演算を学ばせるためじゃない
(喩えは悪いかもだが、方程式の解法で移項というテクニックを教えるようなもの)
457453:2012/01/29(日) 14:34:53.97
レス前にリロードしとけば良かった orz
458デフォルトの名無しさん:2012/01/29(日) 14:41:52.19
>>456
いや、ありがとう
他人に書かれてもドンマイだよ

変数の値が書き換わるのが理解出来ない初心者(かなり稀なパターン)へ手を替え品を替え説明するのに比べれば。。。

変数が箱って言う例えは誰が考えたんだよ。。。
459453:2012/01/29(日) 14:48:17.90
数学で式に文字が導入された頃から漠然とした箱のイメージはあったと思う

値と変数を束縛して固定するイメージよりは、
値を入れるための箱のイメージの方が先にあったのではないか

と、大して根拠もなく個人的には思ってる
460デフォルトの名無しさん:2012/01/29(日) 15:00:35.95
>>459
それは分かる。つーか、自分も似た感覚なんだが、箱の中身がコピーされるとか、新しい値を入れると消えちゃうとかの説明がね。。。
箱じゃ無くて1個のみのスタックみたいなところてん式(追い出された値は捨てられる)の説明でもコピーが説明出来ないしね。。。

まあ、そいつがバカ過ぎなのが問題なんだけど、普通の人はメモリって何?が基準だしなぁ。。。と、基本的な事柄は紙の上で説明出来るのがベストなのかなぁ。。。とか考えてhaskellに流れ着いてたり

ちょっとコンピュータの仕組み齧れば普通の言語の方が自然なんだが。。。

461453:2012/01/29(日) 15:15:26.29
>>460
私がC言語を初心者に教えている時は、一般的な「変数=箱」のような喩えではなく、
もう初めから「変数=メモリアドレスの別名」と直に教える
そして、メモリとはどういう構造か、その上でどんな事ができるかを教えてる

当然メモリって何?が基準だけど、C言語ならそこから逃げられないし
喩えると余計に分かりにくい

Haskellを初心者に教えた事は一度しかないけど、
その時も箱とかの喩え話じゃなく、「変数=値の別名」と直に束縛の概念を教えた
462デフォルトの名無しさん:2012/01/29(日) 15:36:15.61
>>461
自分も結局、変数=値の別名で教えた
おバカなその人はhaskellも無い頃の思い出だが、cpuの仕組み習ってる筈なのに(情報技術科の同級生)、全く理解出来てなかった
そこまでのバカは捨て置いても良いと思うんだけど、手続き型だとスコープの問題もあるのよね。。。
関数内でswapしたのに値が変わってない!!とか
ガッコの先生じゃ無いから、放っときゃ良いんだけど、なるべくそう言う「?」が無い言語が望ましいんじゃ無いかと

本気でプログラマ目指すなら、多分javaやC#しか使わなくても、Cでメモリの概念を直接覚える必要があるだろうな。とは思う
(C#は限定的でもポインタ残してたのは、本当に英断だった)
463デフォルトの名無しさん:2012/01/29(日) 18:06:25.05
>>454
おまえは心が狭いな
素直に自分の間違いを認めればいいのに
464デフォルトの名無しさん:2012/01/29(日) 19:00:27.45
>>463
1、リストの中身を配列に移す
2、配列で値を交換
3、配列の中身をリストに戻す

って書いてて、値の交換が何度も必要な場面で毎回リストに戻す馬鹿がどこに居るよ
行間嫁ってのは、そう言うこと
そんな応用力無い奴はプログラマになれないだろが
465デフォルトの名無しさん:2012/01/29(日) 21:03:37.16
C言語から入るとやたらとメモリの無駄遣いが
気になるのはあるね。

swapは、配列の発想から抜け出せないから出てこないだけで、
リストだと思えば、切ってポインタ繋ぎかえるだけじゃんと思いつくと思う。

Haskellだと、こんな感じか。

swap i j l = let
  (cs,d:ds) = splitAt j l
  (as,b:bs) = splitAt i cs
  in as++[d]++bs++[b]++ds

まぁ、swapくらい標準で用意して欲しい気はする。
466デフォルトの名無しさん:2012/01/29(日) 21:20:50.26
リストでインデックス指定のswapが必要になる時点で型の選択を間違ってる気がしないでもない
綺麗事だけどさ
467デフォルトの名無しさん:2012/01/29(日) 21:50:07.46
まぁ、他のリスト計算(++ や fold系、zip系など)に比べると、
swap の需要は圧倒的に少ないわな

正直、今まで必要になった事があったのかどうか思い出せん
468デフォルトの名無しさん:2012/01/29(日) 22:09:42.45
swapは、Sortに使うね。
Haskellは、Sort簡単だからあまり出番がないのかも。

でも、Sliceは欲しいな。
469デフォルトの名無しさん:2012/01/29(日) 22:38:39.26
>>468
Haskell のリストのソートに swap は使わないだろ
効率的なマージソートの実装が標準ライブラリに既にあるじゃん

ソート関数を自作してまで swap を使う理由は何?
470デフォルトの名無しさん:2012/01/29(日) 22:45:28.87
>>468
マージソートにも、クイックソートにもswap使わないけどね・・・
471デフォルトの名無しさん:2012/01/29(日) 22:52:38.26
いや、別にHaskellの話してたわけじゃないけどな。
swapって言ったらCのqsortなんかが真っ先に思いついたわけだ。

でもって、まぁHaskellじゃ使わんなと思って出番がないと書いたんだが、、、
しょうもないことに一々絡まんでも。

というか、C言語とかあんま使ったことないでしょ?
472デフォルトの名無しさん:2012/01/29(日) 23:11:17.90
>>471
絡むってほどのつもりでもなかったけど・・・
Cは確かにあまり使ってないなぁ・・・

最近は、データ構造の定義がHaskellと似てるなー・・・とか思いながら、ぼんやり復習してるけど
473デフォルトの名無しさん:2012/01/29(日) 23:18:12.48
>>471
俺も別に絡むわけじゃないが

>>468 では Haskell で swap の出番があまりない理由が
「Haskell では sort が簡単だから」に見たから

もし仮に Haskell の標準ライブラリで sort が実装されてなかったら、
swap を使って実装する気だったのかなと思って
474デフォルトの名無しさん:2012/01/29(日) 23:28:13.17
よくよく考えてみると
swapの最大の利点はデータの長さを変えずに済むことなんだよな
だから配列操作に有難がられるわけだ
475470 de 472:2012/01/30(月) 00:04:53.69
>>473
ごめん・・・
標準でsortあるの?
Haskell入門中で、マージソートもクイックソートも自作したけど、swap使わんかったんで書き込んだんだけど、sort関数あるの知らんかった・・・
ソートって、基本、交換じゃなくて、並べ替えだから、リストの切り貼りで出来るから、swap要らんという意味だったのかと・・・
たぶん、純粋に交換したい時しかswap使わないと思われ
要素が少なかったら、コード上で直接交換できるし・・・

--3要素のリスト限定。(大抵、こういう処理はタプルでするっぽいけど)
swap3rd a:b:c:[] = c:b:a:[]


476デフォルトの名無しさん:2012/01/30(月) 00:12:01.81
>>475
> Haskell入門中で、マージソートもクイックソートも自作したけど

それは大変素晴らしいことだ

ただ、ソート関数自体は Data.List に既にある
ライブラリドキュメントを見てみ
(そのドキュメントからソースの中身も見れる)
477デフォルトの名無しさん:2012/01/30(月) 00:29:00.75
>>476
・・・orz
ま、まあ、元々アルゴリズムの勉強不足だったから、良いんですけどね・・・
478デフォルトの名無しさん:2012/01/30(月) 08:40:36.13
マージソートはswapじゃなくてリストを対象としてできるぞ?
479デフォルトの名無しさん:2012/01/30(月) 10:55:57.11
ソートがないと思えるのも、
これまた凄い感覚で好きだぜw
480デフォルトの名無しさん:2012/01/30(月) 18:27:21.44
>>464
おまえ、正真正銘の馬鹿だな。
>>424のリンク先は1組swapする関数で、以後それをベースにした議論が続いていた。
>>424とは異なる前提で議論をしたければ、それを示せ。それが議論ってもんだ。
自分の勝手な妄想が他人にも共有されていると思うほうが
よほど応用力がないオナニー野郎だ。

自分の勝手な妄想を行間などと呼んで、他人にも自動的に賛同してもらえているなど、
正常な判断能力を持つ人間とは考えられない。病院いけ。
481デフォルトの名無しさん:2012/01/30(月) 19:37:07.68
>>480
それをいうなら、>>445で最初に前提覆してるのはおまいさんだろ・・・
と言うか、自分もおまいさんと同じ意見のつもりで>>437書いてたんだが?

swapは

> 1、リストの中身を配列に移す
> 2、配列で値を交換
> 3、配列の中身をリストに戻す

の2で使うだけだろ
1と3は前処理と後処理

それをおまいさんが>>438で煽るから、どんな画期的な手法が出てくるのかと期待してたのに・・・
482デフォルトの名無しさん:2012/01/30(月) 19:47:22.37
>>481
すまんが、>>445はn回まとめてswapを「否定する」内容だと思うぞ。
483デフォルトの名無しさん:2012/01/30(月) 19:51:58.64
>>481
> swapは
>
> > 1、リストの中身を配列に移す
> > 2、配列で値を交換
> > 3、配列の中身をリストに戻す
>
> の2で使うだけだろ
> 1と3は前処理と後処理

え?1,2,3全部で「リスト要素対のswap」じゃないのか?
実際、>>424のリンク先のコードも「リスト要素対のswap」だし。

冷静になって論点を整理してみたら?俺は>>438に同意だ。
「リスト要素対のswap」の実装で配列にコピーしてからswapして
またリストを作りなおすとか、最初にeliminateする実装だ。
484デフォルトの名無しさん:2012/01/30(月) 20:11:13.37
>>482
なるほど、合点がいった
じゃあ、結局、たった一回リストの中身を交換するswap関数は、Cのようにリストと配列がはっきりデータ構造として区別された言語ではどのような処理を行うのがベテランの手法なのだろう・・・
その回答は出てない気がする
私はベテランではないし、最早、>>438に初心者認定されてるしな
485デフォルトの名無しさん:2012/01/30(月) 20:59:22.54
>>480
話と全く関係ないが、感動した。そうだ行間、行間だ。
行間を読めというやつは何処か特徴的だ。
486デフォルトの名無しさん:2012/01/30(月) 22:59:47.18
唐突だが、monad-parallel パッケージってめっちゃ便利だな

例えば複数のIOモナドをひとつのリストに全て入れて
Control.Monad.Parallel.sequence_ 呼べば勝手に並列処理してくれる

プログラムソースが非常にスッキリした
今まで pseq や par を駆使してたのがアホらしくなったわ
(monad-parallel パッケージの中で駆使されているんだが)
487デフォルトの名無しさん:2012/01/31(火) 18:43:29.33
5 :: Int と 5 :: Integerと何が違うのですか?
488デフォルトの名無しさん:2012/01/31(火) 19:16:11.30
>>487
5::Int の型は Int になって、
5::Integer の型は Integer 型になる

よって、この 5 の部分が例えば 2147483648 だと結果の値が変わってくる
489デフォルトの名無しさん:2012/01/31(火) 19:21:46.24
>>487
Intは31ビットで表現できる範囲の整数しか扱えないが、速い(C言語で言うところのintだが、1ビットは型推論に使用)
Integerはメモリの許す限り大きな整数も扱えるが、遅い
490デフォルトの名無しさん:2012/01/31(火) 19:40:11.07
>>489
GHCのIntは32ビットまたは64ビットだよ
Intが31ビットの処理系があってもいいけど、余った1ビットの用途は普通GCで型推論じゃないよ
491デフォルトの名無しさん:2012/01/31(火) 19:42:57.63
objectの型をあらわすタグかな?
492デフォルトの名無しさん:2012/01/31(火) 19:59:59.24
>>490
ごめん。GCだったっけ
Javaとかは31ビットとか無いよなー・・・とか考えて、型推論にしたけど、確かに昔31ビットって聞いたんだが、改めてググってみたら、昔は30ビット、あるいは31ビットだったけど、今は32ビットなんだな。
(64ビットコンパイラは64ビットInt)

http://www.haskell.org/ghc/docs/7.0.3/html/libraries/ghc-prim-0.2.0.0/GHC-Prim.html
493デフォルトの名無しさん:2012/01/31(火) 20:32:31.44
simonpj先生らのboxing/unboxing研究のおかげ。> word一杯のInt
494デフォルトの名無しさん:2012/02/01(水) 12:33:11.89
495デフォルトの名無しさん:2012/02/01(水) 12:35:57.99
>>494
HaskellでのWebフレームワークは面白そうだから興味はあるんだが、いかんせん、
遊びでやるにしてもその前に学ばなければならないことが多いんだよな
496デフォルトの名無しさん:2012/02/01(水) 12:41:38.35
僕のweb framework処女はyesodに捧げます><
497デフォルトの名無しさん:2012/02/01(水) 13:38:07.92
>>494
こういうのが本になっちゃう所がすごいね
http://shop.oreilly.com/product/0636920023142.do
498デフォルトの名無しさん:2012/02/01(水) 15:00:41.95
オライリーの中の人の選球眼が良いんだろうねぇ
499デフォルトの名無しさん:2012/02/01(水) 15:03:27.03
すのいまんは108人いる
500デフォルトの名無しさん:2012/02/01(水) 15:46:12.82
すのいまんって グアルディオラみたいな顔してるね。
501デフォルトの名無しさん:2012/02/01(水) 20:49:46.05
ruby on railsに似たFWってあります?
502デフォルトの名無しさん:2012/02/01(水) 21:28:18.68
市原警察署生活安全課の創価警官名言集

「俺のおかげで家から出れなくした。俺の手柄だ!」

「昼間は市役所のパトロール隊を使う。夜は消防団を使う。」

防犯パトロールと称する近所の創価学会員が
中学生を口実にした何年にも渡る誹謗中傷行為や人権侵害行為について
市原警察署生活安全課の創価警官の指導でやってあげているんだと発言したことについて
「指導じゃない、パトロールをお願いしてるだけだ。俺の責任じゃない!」

いくら創価学会員が集団で誹謗中傷を繰り返しても
調べれば何の前科もない事くらいすぐわかるのに
創価学会員の発言に根拠のない点については完全無視

帰化人の創価学会員が当たり前のように警官になれてしまう狂った世の中

503デフォルトの名無しさん:2012/02/03(金) 08:42:57.25
諸君、ホットな話題は?
504デフォルトの名無しさん:2012/02/03(金) 15:52:10.78
相変わらず俺がモナド理解できない圏に付いて
505デフォルトの名無しさん:2012/02/03(金) 17:33:55.88
圏論に懐疑的な人の方が攻略が早い
506デフォルトの名無しさん:2012/02/03(金) 18:48:41.28
アローはモナドにできる事が全てできます。
アローにできるがモナドにできない事もあります。
アローにはモナド則のような余計な規則がありません。
アローはモナドより理解しやすく圏論を知らなくても理解できます。
だからアローがあればモナドは不要です。

モナドは今となっては無駄に挫折者を増やす過去の遺物です。
Haskellはモナドを全廃しアローに置き換えるべきだと思います。
507デフォルトの名無しさん:2012/02/03(金) 19:26:50.37
>>506
> アローにはモナド則のような余計な規則がありません。

モナド則は「余計」でアロー則は「余計ではない」理由が分からない

もっとちゃんと説明して欲しい
508デフォルトの名無しさん:2012/02/03(金) 19:34:54.82
>>406
> アローはモナドにできる事が全てできます。

この理屈だと、Control.Applicative なども要らない
と言っているように感じる

しかし、実現したい計算と式に関して、
必要十分な機能は何かと考えることは大事だと私は思う
なぜなら、そう考える過程で計算と式が洗練されていくからだ

何でもかんでもアローでプログラムするのは、
プログラミングを不必要に複雑にする事に繋がりかねない
509デフォルトの名無しさん:2012/02/03(金) 19:39:08.83
>506
>アローはモナドにできる事が全てできます。
>アローにできるがモナドにできない事もあります。
逆じゃね
510デフォルトの名無しさん:2012/02/03(金) 22:50:53.19
アローの良質な入門サイトを紹介して下さい(勿論日本語の)
511デフォルトの名無しさん:2012/02/03(金) 23:22:13.48
アロー演算子ならまかせろ!
512餃子チョコレート ◆8X2XSCHEME :2012/02/03(金) 23:25:47.33
513デフォルトの名無しさん:2012/02/04(土) 00:05:18.95
>>506
Arrowの心
http://d.hatena.ne.jp/MaD/20070816
>Monadと同様にArrowにもArrow則という規則があります。
> 1. (a >>> b) >>> c = a >>> (b >>> c)
> 2. arr (g.f) = arr f >>> arr g
> 3. arr id >>> a = a = a >>> arr id
> 4. first a >>> arr pi1 = arr pi1 >>> a
> 5. first a >>> arr (id X f) = arr (id X f) >>> first a
> 6. first a >>> arr alpha = arr alpha >>> first (first a)
> 7. first (arr f) = arr (f X id)
> 8. first (a >>> b) = first a >>> first b
514デフォルトの名無しさん:2012/02/04(土) 13:28:24.89
>>512
読みました\(^O^)/
515デフォルトの名無しさん:2012/02/04(土) 17:10:59.19
要約すると「Arrow はパズル」。
516デフォルトの名無しさん:2012/02/04(土) 17:41:35.25
> とりあえずfirstについてのルール4,5,6,7,8は無視します。
ワロタ
517デフォルトの名無しさん:2012/02/05(日) 10:47:39.79
ghciで階乗の関数factを定義しようとしてるのですが、以下のようにすると
Prelude> let fact 0 = 1
Prelude> let fact n = n * fact (n - 1)
Prelude>
先週まではうまく行ってたのに、急になぜかうまくいかなくなりました。
Prelude> fact 10
^CInterrupted.
Prelude>
fact 10とかやると永遠に返って来ません。
どうもlet fact 0 = 1のあとにlet fact n = n * fact(n-1)とやるとfactの定義が上書きされてる
みたいなのですが、何か間違ってるでしょうか?
518デフォルトの名無しさん:2012/02/05(日) 12:44:07.59
>>517
ghci上ではこうやるといいです

let fact 0 = 1; fact n = n * fact (n-1)

先週か今週にかけて ghc のバージョンアップをしたのでは?
ghciの仕様が変わったかどうか詳細は知らないので、原因は違うかもですが
519デフォルトの名無しさん:2012/02/05(日) 13:16:48.53
>>518
ありがとうございました。動きました。
先週までは
Prelude> let func1 'a' = "aaa"
Prelude> let func1 'b' = "bbb"
こう書けてたと思うんですが、自信がなくなってきました。上のも、こう書けば動きました。
Prelude> let func1 'a'="aaa"; func1 'b'="bbb"
ありがとうございました。
520デフォルトの名無しさん:2012/02/06(月) 18:39:55.29
HaskellはHTMLに<?haskel ?>のように
埋め込めますか?
521デフォルトの名無しさん:2012/02/06(月) 18:43:44.18
>>520
埋め込んだらええやん

それを解釈して正式な HTML や JavaScript なんかに変換する
サーバーアプリに通せばええよ
522デフォルトの名無しさん:2012/02/06(月) 18:51:15.58
なんちゅう名前のサーバアプリがええんですか?
523デフォルトの名無しさん:2012/02/06(月) 19:16:46.10
>>522
そんなん自分で作るんちゃうんかいな

探したって無駄やさかい
524デフォルトの名無しさん:2012/02/06(月) 19:32:44.58
>>523
ホンマですか? えらい難儀な話ですけど、しゃーないですね。
スレ汚しすんませんでした。
525デフォルトの名無しさん:2012/02/06(月) 20:25:45.57
>>523
てげよだきー
526デフォルトの名無しさん:2012/02/07(火) 07:07:30.44
んじちゃーぴら
527デフォルトの名無しさん:2012/02/07(火) 07:48:14.32
a_1 = a_2 = 1, a_n+2 = a_n+1 + a_n

a_9 = a_8 + a_7
  = (a_7 + a_6) + a_7

でa_7をグラフ簡約してくれるようにするにはどうしますか?

まさか a_7 を2度計算するなんて事になったら
土砂降りの中、滑って転んだ野良犬のような惨めに打ちのめされた気分になります

  = (a_7 + a_6) + [a_6 + a_5]_7
  = (a_7 + [a_5 + a_4]_6) + [a_6 + a_5]_7
  = (a_7 + [a_5 + a_4]_6) + [a_6 + [a_4 + a_3]_5]_7
  = (a_7 + [a_5 + [a_3 + a_2]_4]_6) + [a_6 + [a_4 + a_3]_5]_7
  = (a_7 + [a_5 + [a_3 + a_2]_4]_6) + [a_6 + [a_4 + [a_2 + a_1]_3]_5]_7
  = (a_7 + [a_5 + [2 + 1]_4]_6) + [a_6 + [a_4 + [2]_3]_5]_7
  = (a_7 + [a_5 + [3]_4]_6) + [a_6 + [3 + [2]_3]_5]_7
  = (a_7 + [5 + [3]_4]_6) + [a_6 + [5]_5]_7
  = (a_7 + [8]_6) + [8 + [5]_5]_7
  = (13 + [8]_6) + [13]_7
  = 34

ってイメージで
528デフォルトの名無しさん:2012/02/07(火) 18:48:44.70
>>527
何らかの形で共有を明示するしかない
たとえば
fib = 1 : 1 : zipWith (+) fib (tail fib)
529デフォルトの名無しさん:2012/02/07(火) 21:57:38.51
>>528
フィボナッチ以外でも適用できる汎用的なノウハウが欲しいです
寧ろ数列計算よりシミュレーション的な
将棋の次の一手の探索みたいな
530デフォルトの名無しさん:2012/02/07(火) 22:02:40.24
・処理するには新しい処理が芋蔓式に出現する
・それらの多くが頻繁に共通にあらわれる・共通処理は省かないと総処理は天文学的オーダーで膨れ上がる


こういうケースの汎用指針が欲しいです
531デフォルトの名無しさん:2012/02/07(火) 22:07:23.01
DPを自動でやりたいように見えた
532デフォルトの名無しさん:2012/02/07(火) 22:09:06.55
>>530
メモ化ね
汎用指針は、計算済みの値を捨てないで保存しておくこと
IOとかStateモナド上で状態にして引き回してもいいし、
>>528みたいに、全部の値を含む(場合によっては無限の)データ構造を定義してもいい
533デフォルトの名無しさん:2012/02/08(水) 07:20:52.45
>>531
「芋蔓式に出現する」の意味がよく分からないけど、新しい式を書き加えてなんどもコーディングするっていうことなら、トップレベルに定義していけばよいんじゃないの?

コーディングを繰り返さないなら、>>532のいうようにメモ化を求めているんだろうけど、将棋の次の一手とかメモ化したら空間オーダが爆発しそうだな。
それで解決できるなら、将棋の決して負けない手順がすでに明らかになっているだろうし。
そのレベルのことをどうしてもやりたいなら金に糸目を付けず並列クラスタを作るしかないんじゃないの?
534デフォルトの名無しさん:2012/02/08(水) 07:50:15.51
「Stringはオワコン。これからはText」って言われてるのを見て
Data.Text を使おうとしたけれど、なんで index が O(n) なの?
中身はただの配列だと思ってたのに。
http://hackage.haskell.org/packages/archive/text/0.11.1.13/doc/html/Data-Text.html

535デフォルトの名無しさん:2012/02/08(水) 09:20:34.12
データはコピーしないで、リストでデータの在処を持ってるんでしょ。
lastがO(1)だからケツも押させてるんだと思う。
536デフォルトの名無しさん:2012/02/08(水) 11:41:41.19
>>535
ありがとう。

ソースをざっと見てみたら、配列・オフセット・長さの組を使っているようだっ
た。単なる配列じゃないのは、部分文字列(tail とかで)でコピーしなくていい
ようにするためらしい。

で、index が遅いのは、Unicode のサロゲートがらみみたい。index s n の n
が文字数なので、サロゲートがあると配列のインデックスとずれてしまうせい
で、先頭か最後から順番に数えてるようだった。length が O(n) なのも、たぶ
んそれが理由。

ちょろっと眺めただけなので、まちがってるかも。

とりあえず String より遅くはなさそうなので、もうちょっと試してみます。
537デフォルトの名無しさん:2012/02/08(水) 12:05:29.10
とにかくでかいデータ用だぜ。
538デフォルトの名無しさん:2012/02/08(水) 12:10:04.92
時代はUTF32
539デフォルトの名無しさん:2012/02/08(水) 12:35:16.38
UTF48
540デフォルトの名無しさん:2012/02/08(水) 13:42:13.86
541デフォルトの名無しさん:2012/02/08(水) 18:37:49.70
>>539
warota
542デフォルトの名無しさん:2012/02/10(金) 21:18:58.47
QuickCheck って Monad もテストできるのずっと気づかなかった
543デフォルトの名無しさん:2012/02/10(金) 23:30:34.09
本屋に行ったけど、RWHしかなかった
人気ないのかな…
544デフォルトの名無しさん:2012/02/11(土) 02:30:53.27
>>543
人気の定義による。

・プログラマー人口内のシェア?
→世間のビジネスの9割以上は単純な事務作業なので、 そういう処理を書ける言語はHaskell以外に沢山ある。
ちなみに、書店はシェア重視。

・ある問題領域で解決したい課題を持つ者にとって、ロジックを実装しやすいか?
→自分と同様の問題領域の人を探したほうがいい。
545デフォルトの名無しさん:2012/02/11(土) 08:27:54.18
>>543
RWHの和訳って前半部分がいまいちわかりにくいのが残念。
また、あのままでGHC7以後で動かそうとすると、ちょっと面倒なところ
が出てる。だから、改訂版に期待したいんだがな。
546デフォルトの名無しさん:2012/02/11(土) 08:30:21.86
・Haskell高速化テクニック
なんて本がでないかな?
547デフォルトの名無しさん:2012/02/11(土) 08:31:18.34
言いだしっぺの法則
548デフォルトの名無しさん:2012/02/11(土) 08:40:30.32
オライリーが投資を回収できてれば次も期待できると思うが、どうなんだかね
549デフォルトの名無しさん:2012/02/11(土) 09:05:15.98
yesod本がでるくらいだから、RWHは収益が上がってるんじゃないかと?
>>547 残念だけど、教えて欲しい立場。人にチューニングを語れるほどじゃないし。
550デフォルトの名無しさん:2012/02/11(土) 09:23:04.02
Haskell wikiのPerformanceの項とかmkothaさんの記事
ghcのドキュメント
ghcのプロファイリング機能とかcriterionパッケージ
thread scope

最終的には諦めてC++/Asmで書く
551デフォルトの名無しさん:2012/02/11(土) 12:12:58.97
クリテリオンんて何かワクワクする語感だな
アニメでいうとロボものだろう
552デフォルトの名無しさん:2012/02/11(土) 12:46:57.36
クライテリオンな

まぁ別にどっちでもいいことだけど
553デフォルトの名無しさん:2012/02/11(土) 13:56:27.61
超聖判規クライテリヲン
554デフォルトの名無しさん:2012/02/11(土) 19:24:57.36
あ、関節の病気か。
555デフォルトの名無しさん:2012/02/11(土) 23:32:33.40
2日に GHC のバージョンが 7.2.2 から 7.4.1 に上がってたのか

ghci 上で data や instance なんかの宣言ができるようになってた
これは便利

それはそうと、さっさと実行時に利用コア数を変えられるようにしてほしいものだ
556デフォルトの名無しさん:2012/02/11(土) 23:50:35.15
setNumCapabilities
増やせるだけで減らせないみたいだけど
557デフォルトの名無しさん:2012/02/11(土) 23:54:08.17
we recommend installing the Haskell Platform instead of GHC. The
current Haskell Platform release includes a recent GHC release as well
 as some other tools (such as cabal), and a larger set of libraries
that are known to work together.

と書いてるからさ、5月まで待ったほうがいいんじゃない? <7.4.1
558デフォルトの名無しさん:2012/02/11(土) 23:59:10.81
GHCの代わりにHaskell Platformをインストールするのを薦めとくわ。いまの
Haskell Platformは最近のGHCを含んでいて、おまけに、他のツール(cabalと
かね。)も動くし、よく使われてるライブラリも動くからさ。

だとさ、と意訳しとく。
559デフォルトの名無しさん:2012/02/12(日) 00:00:24.87
既存プロジェクトの移行はライブラリが7.4に対応するまで待つとしても、
普段は最新版使った方が楽しい
560デフォルトの名無しさん:2012/02/12(日) 00:03:51.27
Debian系統だとHaskell Platformは単なる仮想パッケージ。
561デフォルトの名無しさん:2012/02/12(日) 00:06:35.18
>>559
まあ、こなれた人ならそうかもしれない。でも、ここって、いろんな人が
いるから、一応書いといた。こなれた人ならトラブルに出会っても、解決
できるだろうし、それが楽しいもんな。

https://groups.google.com/forum/?fromgroups#!forum/haskell-jp
でも、しんさんがリリースのメールに注意書きがされているけどね。
562デフォルトの名無しさん:2012/02/12(日) 08:01:47.18
someRecord{someField = f $ someField someRecord}

haskellのレコード構文って何でこんなきもちわるいの
フィールド一つ書き換えただけの新しいレコードが欲しいだけなのに
563デフォルトの名無しさん:2012/02/12(日) 08:17:24.52
ご覧下さい
このクランケの症例では

・碌に調べもしない
・煽る事で住人達に答えさせようとしている

点が伺えます

これらは怠慢横柄病患者に共通に見られるのです
564デフォルトの名無しさん:2012/02/12(日) 08:37:41.32
バレたか・・・
いやまあ、自分で調べなかったわけでもないんだけどな
ほぼ無理なのは分かってる
565デフォルトの名無しさん:2012/02/12(日) 08:40:12.60
本当の地獄はレコードをネストさせてからだ…
566デフォルトの名無しさん:2012/02/12(日) 11:11:24.92
>>562
どういう書き方ができると良かったの?
567デフォルトの名無しさん:2012/02/12(日) 11:22:02.57
>>556
増加だけでもできるようになったのか
リリースノートを斜め読みしてたから見逃してた
568デフォルトの名無しさん:2012/02/12(日) 11:34:11.27
ネスとされたレコードの書き換えはdata-accessorとかlenseとか使うと少しは楽になるけど
これパフォーマンスどうなるんだろうという不安が出てくる
569デフォルトの名無しさん:2012/02/12(日) 11:35:43.98
>>568
神に従え
570デフォルトの名無しさん:2012/02/12(日) 12:17:15.85
>>566
SomeRecordとSomeFieldを二回も書きたくないというか
フィールドと同名のgetterを自動生成するような動きを許容したのなら
もっとはっちゃけて欲しかったというか
テンプレート? テンプレートなぁ・・・
571デフォルトの名無しさん:2012/02/12(日) 12:29:24.18
TemplateHaskellの有用性はlispが示している
572デフォルトの名無しさん:2012/02/12(日) 13:23:20.06
>>570
そうは言っても、「汎用的にするなら」 少なくとも

1. 何のデータ型の(値の)
2. 何のフィールドを
3. どう変えるのかを

この3つのは何らかの形で指定する必要があると思うが
573572:2012/02/12(日) 13:31:17.15
>>570
すまん、不満点をちょっと勘違いしてたみたいだ

こういうことか

someRecord { someField = f $ someField someRecord }

{} 前の someRecord の部分が型構築子じゃなく値構築子の場合、
f $ someField someRecord の someRecord 部分は明白だから省略可能

こうなれば、幾分スッキリするな
574デフォルトの名無しさん:2012/02/12(日) 15:04:59.49
Cabal でライブラリをインストールする時、
オプションで library-profiling を有効にすると、
そのライブラリもプロファイリングの対象にできるよね

これって、プロファイリングしないで普通に使う時は
遅くなったりしない?
575デフォルトの名無しさん:2012/02/12(日) 15:11:00.59
-pを使うとパッケージを二通りコンパイルする
ので遅くならない
576デフォルトの名無しさん:2012/02/12(日) 15:31:06.20
>>575
そっか、安心した
ありがと
577デフォルトの名無しさん:2012/02/12(日) 19:23:37.68
Yampa の par 関数の型について質問です。
(他のパラレル系関数もですが、代表して par を選びました)

par :: Functor col => (forall sf. a -> col sf -> col (b, sf)) -> col (SF b c) -> SF a (col c)

このルーチン関数の sf という型変数には、SF b c 以外入ることは無いと思うのですが、
単純に a -> col (SF a b) -> col (b, SF a b) という型では何がいけなかったのでしょうか
578デフォルトの名無しさん:2012/02/12(日) 21:52:55.77
Cabal で --enable-documentation とやっていっしょにインストールされるドキュメントに、
ソースコードへのリンクが貼られるようにする方法はないのでしょうか?

HackageDB のサイトで見られるドキュメントみたいにしたいです
579デフォルトの名無しさん:2012/02/13(月) 10:41:10.37
>>577
スライドとか論文だと確かOpacity(透過性?)のためとか書いてあって、
俺も正確な意味はよくわからなかったんだけど、
SFを書き換えられるような関数を渡せるのを防止してるんじゃないかな。
route a xs = [(a, identity)]
みたいな、コレクションの中身を無視して出所不明のSFにしちゃうような。
580デフォルトの名無しさん:2012/02/16(木) 05:11:31.94
F#を始めたのだが、モナドで行き詰まっている。
F#の本にはモナドのことが書いていない。
で、ネットでモナドのことを収集すると、ハスケルのがほとんど。
F#での説明もあるが、なんか解りづらい。

で、モナドって何ですか?
関数型プログラミングをやるにはモナドが必須ですか?

どなたか教えてください _o_
581580:2012/02/16(木) 05:15:46.89
ちなみに数学科出身ですが、圏論は知りません。
習った覚えがありませんし、仮に習っていても記憶にないのだから、習っていないのと同じです。
582デフォルトの名無しさん:2012/02/16(木) 05:48:37.15
モナドはモナド則そのもの。
使い方としてはモナド則を頭に入れてからListモナドとStateモナドを理解すれば後は大体類推が利く。
F#でどうなのかは知らないが、少なくともHaskellで何か書こうと思ったらモナドは必須。
まあ「モナドとは何か」みたいな話は過去スレ遡ればいくらでも出てくるよ。
583デフォルトの名無しさん:2012/02/16(木) 08:10:51.47
わかればわかるけど、モナドはモナド則そのものってのが禅問答みたいで
わかりにくいんだよなぁ。。

Haskellのクラスは、C++でいう抽象クラス見たいなもので、
Haskellのモナドがクラスでどう定義されてるか調べていけば、
意味はわからなくても、使い方はわかると思うよ。

モナドの意味は使っている内に、なんとなくわかるようになる、、、と思う。
584デフォルトの名無しさん:2012/02/16(木) 09:19:10.08
コンポーネントのようでコンポーネントでない
象のようで象のようでない
さてはモナドって南京弾簾だろ!
585デフォルトの名無しさん:2012/02/16(木) 09:37:41.55
Haskell 最大の失敗はモナドにモナドという名前をつけたことにある。
もっと「もこもこ」みたいな可愛い名前にすれば大流行していた。
とか講演でいってたな。
586デフォルトの名無しさん:2012/02/16(木) 09:48:34.02
名前はモナドのまま、バインド演算子を ( ´∀`)みたいなのにすれば良かったのではなかろうか
587デフォルトの名無しさん:2012/02/16(木) 09:51:36.68
ガンダムで頼む
588デフォルトの名無しさん:2012/02/16(木) 10:16:54.54
>>585
そのソースはどこよ?w
589デフォルトの名無しさん:2012/02/16(木) 13:28:49.11
>>588

元ネタはこれのはず。

Wearing the hair shirt: a retrospective on Haskell (2003)
Simon Peyton Jones, invited talk at POPL 2003.
http://research.microsoft.com/en-us/um/people/simonpj/papers/haskell-retrospective/

Our biggest mistake
Using the scary term "monad" rather than "warm fuzzy thing"
590デフォルトの名無しさん:2012/02/16(木) 14:37:03.09
2011年版はビデオで見られる。ちょっと重いけれど。
Escape from the Ivory Tower: The Haskell Journey, from 1990 to 2011
http://yow.eventer.com/events/1004/talks/1054

簡単だけど32分あたりに "warm fuzzy thing" が出てくる。

各銀行が秘密の Haskell 部隊を雇ってるって話はどこまで本当なんだろう。
591デフォルトの名無しさん:2012/02/16(木) 15:37:45.12
>>583
なんでこのなものが要るのか直感的に分からないってこと?
592デフォルトの名無しさん:2012/02/16(木) 15:56:24.13
>>585
そして処理が一本道だから
もこもこで一本道

略して もこみち とかどうよ?
593デフォルトの名無しさん:2012/02/16(木) 16:21:24.02
>>583
Haskellの型クラスはC++の抽象クラスとは全く違うよ。
オブジェクト指向の考え方は捨てるべき。
594デフォルトの名無しさん:2012/02/16(木) 18:14:54.42
Haskellとオブジェクト指向は根本的に違うから例えて考えるのは実際の処理挙動ぐらいにしたほうが……
595デフォルトの名無しさん:2012/02/16(木) 18:27:40.48
C++にはクラスという機能を用いて現実世界の概念を抽象化することに成功し、直感的な設計・実装が行えるようになった
Haskellでは、どのようなパラダイムがこれから出てくるのか
私はそれが楽しみでならないのです
って去年死んだおじいちゃんが死ぬ間際に言ってた
596デフォルトの名無しさん:2012/02/16(木) 18:49:29.40
ぷうぷう!
597デフォルトの名無しさん:2012/02/16(木) 19:05:35.61
もこもことかモコナとかそういうかわいいのはいらない
モサドにしよう
598デフォルトの名無しさん:2012/02/16(木) 19:24:01.77
>>595
Haskellは遅延評価という機能を用いて現実世界の手順を隠蔽することに成功し、
宣言的な設計・実装が行えるようになりました。
しかしHaskellは関数型言語からは踏み出さないだろうから、新しいパラダイムは
Ozのようなマルチパラダイム言語に期待すべきだろうと思えてならないのです。
って友達がさっき言ってた。

コンピュータプログラミングの概念・技法・モデル
http://toro.2ch.net/test/read.cgi/tech/1196257692/
599デフォルトの名無しさん:2012/02/16(木) 19:27:51.75
Ozはオワlan
600餃子チョコレート ◆8X2XSCHEME :2012/02/16(木) 20:52:04.09
うまいな。
一瞬「終ったランゲージ」と思わせといて実は「終わらん」というダブルミーニングですね!!
601デフォルトの名無しさん:2012/02/16(木) 22:13:47.28
>>593
そう?
「Learn You a Haskell for Great Good!」には、JavaのInterfaceみたいなのと
考えたほうがいいって書いてるけど。
全く違うっていうならどう考えればいいか説明してほしいな。

602デフォルトの名無しさん:2012/02/16(木) 22:27:34.65
>>591
最初、(>>=)はただ関数に引数にして渡すだけじゃないか、なんで必要なんだとか思ってた。
他のもなんでこんなのが必要か理解できなかったよ。

変な型修飾付けるせいで、型が違うって怒られるし。

でもそうやって好き勝手書けないようにするのが狙いなんだな。
603デフォルトの名無しさん:2012/02/16(木) 22:46:41.67
デザインパターンみたいなもの、でいいと思うけどな > モナド
604デフォルトの名無しさん:2012/02/16(木) 22:56:34.58
私は >>593 ではないのですが、逆に訊きたいです

Haskell の型クラスと Java のインターフェイスにおいて、
考え方の共通点とは何でしょうか

それは、コンパイル時にどう解釈されるかというレベルの共通点でしょうか
それとも、アプリケーションを作る上での指針となるくらいのレベルの共通点でしょうか
605604:2012/02/16(木) 22:57:13.58
>>604
すいません、>>601 に対しての質問です
606デフォルトの名無しさん:2012/02/17(金) 03:06:37.40
Haskellのclassはplatformに改名しろ
607デフォルトの名無しさん:2012/02/17(金) 04:24:56.80
型を集合だと考えれば型クラスって命名は自然
608デフォルトの名無しさん:2012/02/17(金) 04:41:03.84
型(type)のメタ概念として類(class)という名前を採用することは間違っていない
ただし、これだけオブジェクト指向の概念が普及しているのが現実なのだから、
それを配慮した命名が望ましかった(かもしれない)ということ

これをHaskellの傲慢さと見るか、それとも数学的に正しい命名であると見るかは
判断が分かれるところ
609デフォルトの名無しさん:2012/02/17(金) 04:50:13.16
オブジェクト指向のclassが類と無関係だと思ってるっつーか、
類をモデルにしているのはtype classだけだとか思ってるところが
Haskellerの傲慢さじゃないの?
610デフォルトの名無しさん:2012/02/17(金) 05:12:11.76
611デフォルトの名無しさん:2012/02/17(金) 06:49:42.48
>>609
オブジェクト指向のclassって命名にケチつけてるなら
Haskellerは傲慢だけど、そうじゃないよね?
612デフォルトの名無しさん:2012/02/17(金) 07:36:36.25
オーバーロードは必要でオーバーライドは不要だと思ってるところが傲慢だ
613デフォルトの名無しさん:2012/02/17(金) 09:25:13.67
614デフォルトの名無しさん:2012/02/17(金) 09:28:48.05
>>550
Johan TibellのHaskell Performance Patterns talkのスライドも
このリストに追加の資料になりそう。
615デフォルトの名無しさん:2012/02/17(金) 11:31:01.99
>>604
全く同じとまでは言わないけど、
Haskellのtype ≒ Javaのclass
と考えたときに、
Javaのinterfaceがclassにまたがって横断的に制約を作れるというところが、
Haskellの型クラスがデータ型を横断して共通の「クラス」を作れるところ
と似てるって言ってるんじゃないの。
とりあえず最初の入り口から何でも違う違う言ってたら、誰もHaskell始められないよ。
616デフォルトの名無しさん:2012/02/17(金) 11:43:00.28
>>615
このスレを見て面白そうなので僕は今日から始めました。
617デフォルトの名無しさん:2012/02/17(金) 12:42:29.71
>>615
ということは、それはコンパイル時の解釈の問題ですよね

>>593
> オブジェクト指向の考え方は捨てるべき
と言っており、これはアプリケーションを作る指針となる考え方において、
抽象クラスとは違うことを言っているように思えます

もしそうなら、それに対する反論としての >>593 は的外れだと思います

>>583 も、わかればわかるけど、モナドはモナド則そのものは解りにくいと言ってることから、
入門レベル(最初の入り口)は通り過ぎているものと思われます。


> とりあえず最初の入り口から何でも違う違う言ってたら、誰もHaskell始められないよ。

それはそうですが、それとは別問題として、話が噛み合っていないような気がします
618はちみつ餃子 ◆8X2XSCHEME :2012/02/17(金) 13:03:38.71
俺もあんまり「××のようなもの」っていう解釈はしない方がいいと思ってる。
部分的に機能がかぶるだけで類似性を見出していたのではそれに引き摺られて根本的なパラダイムの理解に進み難い。
619デフォルトの名無しさん:2012/02/17(金) 13:25:22.45
type classってオーバーロードと型推論を両立するための妥協だから
パラダイムみたいな高尚な概念じゃないよ
620デフォルトの名無しさん:2012/02/17(金) 13:34:40.12
そんなこと言ったらOOPにだってパラダイムなんて高尚なもん
一つも無ぇっつーの
621615:2012/02/17(金) 14:08:40.22
>>617
話の流れ見てなかった。すまんかった。
だからケンカしないで。
622デフォルトの名無しさん:2012/02/17(金) 14:17:39.16
>>617
横レスだけど、

・オブジェクト指向のクラスもHaskellの型クラスも
 「抽象データ型」の実現という意味では似ている(>>615)
・オブジェクト指向の「インヘリタンス」とHaskellの「アドホック型多相」とは
 型システム理論という意味では全く違う(>>593)

ということじゃないのかな?
各用語の意味は、自分で調べてね
623デフォルトの名無しさん:2012/02/17(金) 14:31:40.54
>>622
OOPの「継承」は部分型多相では?
624デフォルトの名無しさん:2012/02/17(金) 14:34:40.69
>>623
オーバーライトや疑似変数selfなんてのは、部分型多相には存在しない概念/理論
625デフォルトの名無しさん:2012/02/17(金) 14:46:11.83
>>623
なるほど。型理論勉強します。
626625:2012/02/17(金) 14:46:38.91
>>624 だった
627デフォルトの名無しさん:2012/02/17(金) 14:58:14.86
>>619
型クラスにはアドホック型多相という理論的基盤があるから、
それはいわゆる「高尚」と表現してもかまわないんじゃまいかと思う

>>620
OOPの継承というのは直感的かつ曖昧なもので、その足場は非常に不安定
だからオブジェクト指向について10人に尋ねれば、10人それぞれが異なった解釈を返す
そんな代物を「高尚」とは、とても呼べないんじゃまいかと思う
628627:2012/02/17(金) 15:10:40.81
訂正

X: OOPの継承というのは....
O: OOPというのは....
629デフォルトの名無しさん:2012/02/17(金) 15:18:03.49
>>624
概念/理論は存在したり存在しなかったりするんだな・・・
それなら概念/理論を教えるよりも実装を教える方が良い
630デフォルトの名無しさん:2012/02/17(金) 15:22:36.71
例えばC++で言うところのオブジェクト指向とは
・情報隠蔽
・継承
・ポリモーフィズム
でした
631デフォルトの名無しさん:2012/02/17(金) 15:26:42.34
オーバーロードをアドホック多相と言いかえると何か凄そうに見えるテクニックはテストに出ます
632デフォルトの名無しさん:2012/02/17(金) 15:39:17.02
>>629
>概念/理論は存在したり存在しなかったりするんだな・・・

え、オーバーライトや継承の概念を含む、いわゆる「継承の型システム」に関する理論は、
いくつか存在しているよ
足りないのは動的なメソッド結合(ダックタイピング)や動的な型付け(メタプログラミング)の理論

そんな完成した静的型付けな型システムの一つを実装したのがObjective-Caml
ただし、(Objective-CがOOとCのハイブリッド言語であるように)
部分型多相と継承は理論的に全く違うから、両者のハイブリッドになっている
結果として、残念ながら「関数型パラダイムにおけるオブジェクト指向」という理想には程遠い
633632:2012/02/17(金) 15:41:17.07
また訂正

X: オーバーライトや継承の概念を含む、....
X: オーバーライトや疑似変数selfの概念を含む、....
634はちみつ餃子 ◆8X2XSCHEME :2012/02/17(金) 15:48:26.21
>>633
また訂正ですね!!
635632:2012/02/17(金) 16:17:42.90
>>634
...orz

すぐに分かってくれたようだから、あえて訂正しないw

>>631
MLやHaskellでは、JavaやC++のようなNullPointerExceptionやBusErrorは発生しない
型に関するミスは、コンパイル時にすべて検出できる
それが、理論的背景のある型システムの「凄さ」だと言える

次のテストに出すかもしれないから、よく復讐しておくように
636デフォルトの名無しさん:2012/02/17(金) 16:40:57.39
別に凄くない
むしろ、すべてに責任をもつことはできないから責任を限定する理論が必要になる
型に関するミス以外は管轄外だし
プログラマーが勝手に Nothing とか [] を使うのは自己責任
637デフォルトの名無しさん:2012/02/17(金) 16:47:11.46
言語の中でNullを扱わなくなっただけで、Nullみたいな値の濫用の余地は残るわけですよね。
昔のCOBOLはNULLが扱えなくて0000や9999などの値で成功失敗とか表現していましたし、そういうシステムはかなり多いと聞いています。
つまり、NULL無いんなら0000や9999でいいやと思うような人には型システムなんて意味ないんじゃないでしょうか?
638デフォルトの名無しさん:2012/02/17(金) 16:56:36.58
>>611
他パラダイムや他言語を矮小化する一方で、
「無秩序でいい加減な」という意味のアドホック多相を
あたかも高尚なものであるかのように
誇張しているだけだから、傲慢じゃなくて
滑稽だね。
639デフォルトの名無しさん:2012/02/17(金) 17:06:52.05
ad hoc
 adv., adj. (特に)このために[の], 特別に[の], この場限りで[の], その場限りで[の].
                        研究社 新英和大辞典 第6版
640デフォルトの名無しさん:2012/02/17(金) 17:20:15.57
641デフォルトの名無しさん:2012/02/17(金) 17:21:05.17
カズヤマモトサンかっけー
642デフォルトの名無しさん:2012/02/17(金) 18:09:29.51
この流れで質問させてください
型クラスってのは代数的構造のことではないんでしょうか?
643デフォルトの名無しさん:2012/02/17(金) 18:48:32.83
>>642
そんなようなものだけどもうちょっと一般的
C aというインスタンスのメソッドの戻り値の型はa以外になり得る
OrdとかShowとか
644デフォルトの名無しさん:2012/02/17(金) 18:57:33.81
>>635
ヌルポは値に起因するバグで、型システムによる安全性の保証外なのはML系でも同じだよ。
MaybeはまんまC#のnullable<T>だし。
Haskellはパターンマッチでパターンを網羅してないとちゃんと警告出してくれたり、
Maybeモナドみたいな明示的にチェックを書かなくても済む仕組みその他諸々のおかげでバグりにくいって話で、
コンパイルで検出出来てるわけじゃないし、発生しないわけでもないよ。
645デフォルトの名無しさん:2012/02/17(金) 19:12:32.81
>>642
型クラスもデータ型もメモリ上のビットも代数的構造
646デフォルトの名無しさん:2012/02/17(金) 19:24:43.41
NullPointerExceptionはバグなの?
647デフォルトの名無しさん:2012/02/17(金) 19:29:54.49
>>644
Maybeはぬるぽがっされないような、、、
648デフォルトの名無しさん:2012/02/17(金) 19:43:26.86
>>645
そういう文脈で代数的構造と言った場合の「代数的」とはどういうものですか?
649デフォルトの名無しさん:2012/02/17(金) 20:02:36.22
>>648
代入可能なこと
定数以外は代数的構造
650デフォルトの名無しさん:2012/02/17(金) 20:55:05.10
>>647
トリビアルな例だけど、常にJustな事が期待されてる変数alwaysJust :: Maybe aがあったとして、
1)
case alwaysJust of --これは警告がでるけど
 Just x -> x

2)
let (Just x) = alwaysJust in x -- こんなドタコなコードは書かないけど…

3)
-- fooの使用者からは定義かドキュメントを見ない限り、例外が上がってくる可能性がある事は知りようがない
foo :: a -> a
foo v = fromJust $ do -- fromJustってどういうケースで使うんだろか…。
 x <- alwaysJust
 v' <- Just v
 ...
 return v'

もし、alwaysJustがバグっててNothingだったら、上の例は全部例外あげてくる。
特に3番目みたいな外からは一見安全に見える型の関数でも、ガッされない絶対の保証があるわけでも、検出できるわけでもないよ。
(1番目以外は警告すらでないし)

Maybeからそれると、Preludeの関数でもListのheadとか(!!)とか、Enumのsucc、predとかreadやArrayとか、
プログラマがちゃんと保証しなきゃいけない関数も結構あるし。
651デフォルトの名無しさん:2012/02/17(金) 21:29:13.08
Maybeからそれると、Intも危険だよね
オーバーフローして意図しない挙動をする危険性があるから
プログラマがちゃんと保証(ry
652デフォルトの名無しさん:2012/02/17(金) 21:31:32.72
RWHを買ってきました
あしたRWHを一日かけて読み切ります
何か注意点とかありますか
653デフォルトの名無しさん:2012/02/17(金) 21:35:16.99
急いで読まない
654デフォルトの名無しさん:2012/02/17(金) 21:59:05.59
コードを写経して動かなくても文句言わない
655デフォルトの名無しさん:2012/02/17(金) 22:12:05.67
なんか、ものすんごい勢いでレスついてるね。
みんな暇か?
656デフォルトの名無しさん:2012/02/17(金) 22:15:37.70
詰まったり解らなかったり動かなかったら本家(>>5の上)のコメントなんかも参照
一日で読み切れなくても泣かない投げない
657デフォルトの名無しさん:2012/02/17(金) 22:19:09.47
>>652
最初からまじめに読んでいくと冗長度が高くて飽きる。飛ばして途中から見ると何言ってるのか分からない。
昆虫本には良くあることです
658デフォルトの名無しさん:2012/02/17(金) 22:28:48.44
今 GHC 7.4.1 の環境です

デュアルコアのCPUを使ってて、GHC の RTS オプション -N2 で、
2スレッドが平行して動くことは確認できました

今 Intel のハイパースレッディング(HT)機能を持つ CPU に変更する検討をしていますが、
GHC のマルチコア機能はHTに対応するのでしょうか

コア数を返す関数がHTを考慮した論理コア数を返す事はリリースノートで確認しましたが、
実際に平行して動くスレッドの数として正しく機能するかという質問です

つまり、例えばコア数2のHT機能を持つCPUで -N4 を指定すれば、
ちゃんと4つのスレッドが平行して動くのでしょうか
659デフォルトの名無しさん:2012/02/17(金) 22:30:08.58
RWH一日は無理だろ
660デフォルトの名無しさん:2012/02/17(金) 23:04:02.43
>>658
>GHC のマルチコア機能はHTに対応するのでしょうか => Yes
>ちゃんと4つのスレッドが平行して動くのでしょうか => No
ちゃんとの意味にもよると思いますが
詳しくはwikipediaを
661デフォルトの名無しさん:2012/02/17(金) 23:25:23.88
>>660
> ちゃんとの意味にもよると思いますが

例えば RTSオプションで -s を指定して実行して得られる情報において、
コア数2のCPUよりコア数2HTのCPUの方が、
よりコア数4のCPUに能力的に近いと分かる結果が計測値として出るか、
という意味です
662デフォルトの名無しさん:2012/02/18(土) 00:28:18.38
>>661
だったらあらためてNoです
HTではほとんど性能向上しません(だったような
663デフォルトの名無しさん:2012/02/18(土) 09:15:59.39
HTって遊んでるユニットを怠けさせないで酷使させる機能に過ぎないから
遊んでるユニットが登場しないサイクルでは機能しない
なんちゃって2倍でしょ
664デフォルトの名無しさん:2012/02/18(土) 09:36:00.16
665デフォルトの名無しさん:2012/02/18(土) 18:34:36.09
RWHどうなった?
666デフォルトの名無しさん:2012/02/18(土) 19:03:40.00
>>662
コア数2のノーパソから手頃かに価格のコア数2HTのノーパソに買い換えようかと思ってましたが、
Haskell 絡みではあまり幸せになれなさそうですね
コア数4くらいのがもう少し安くなるまで待つことにしました

>>663
なるほど、妙に納得しました
667デフォルトの名無しさん:2012/02/18(土) 19:09:24.78
正確に2倍になるわけじゃないが、1.7倍ぐらいは楽勝でいくだろw
668デフォルトの名無しさん:2012/02/18(土) 19:38:41.19
1.7倍どころかインテル自称で20%増し程度じゃないのか
その上、場合によっては遅くなったり、不具合出るオマケ付きっつー…
まぁHTとHaskellは殆ど関係ないんじゃないか?
669デフォルトの名無しさん:2012/02/18(土) 21:01:38.89
HTで速くならないのはコンパイラがそういう最適化をしてないからだろ
1ヶ月ぐらいCPUぶん回す数値計算ならHT向けの最適化をやる意味はあるだろうが、
特に用途も決まってないHaskellが特定のCPU命令セットの最適化して意味があるとは思えないが
670デフォルトの名無しさん:2012/02/18(土) 21:15:03.37
インテルの発表で
sandybridgeで8割に上がったような話があったような気がする。
たしか、HT:ONの場合、
マルチコア全部使い切るようなプログラムのスループットは1->0.8x2x(smp8コア/4コアの効率比が1として)=1.6ぐらい。
ただし、シングルプロセスの実行部分は、
邪魔されて0.8ぐらいまで落ちる場合があるが、
OSのプロセス管理で、なるべく占有できるところに配置される。
671デフォルトの名無しさん:2012/02/18(土) 21:16:07.06
いままでは、7割、7.5割と上がってきてたのが8割。
672デフォルトの名無しさん:2012/02/18(土) 21:19:56.22
コンパイラがいくらがんばっても演算密度が十分濃ければSMTで性能は上がらないでしょ
673デフォルトの名無しさん:2012/02/18(土) 21:21:34.04
>>669
HTの効果を利用するには専用の命令セットを叩く必要があるのでしょうか

今までずっと、特に意識すること無く自動的に各HTに処理を割り振ってくれると思ってました

repa を使ってるとダイレクトにマルチコアの恩恵を受けるので、
HTで更に2倍になるならいいなぁと思ってたんですが・・・
674デフォルトの名無しさん:2012/02/18(土) 21:25:55.33
ようするに、HTで4PC/8VCなら、
OFF:1-4が、
ON:0.7-5.6、0.75-6.0、0.8-6.4
とP4のころに比べて進化してきてるような話だったと思う。
675デフォルトの名無しさん:2012/02/18(土) 22:14:43.49
>>673
すまん。HT用のインストラクションじゃなくて、HT用に処理をマルチスレッドに分解したり、
スレッドに適したキャッシュ配置にするような特定のCPUアーキテクチャ実行モデルを仮定した最適化という意味だった
ICCとかがそういう最適化を前面に出してるが、実際にはそれほど単純には速くならない
676デフォルトの名無しさん:2012/02/18(土) 22:50:19.80
>>675
なるほど、でも

> HT用に処理をマルチスレッドに分解したり

この部分は、元々シングルスレッドだったものを、
コンパイラが「勝手に」上手くマルチにしてくれることは無い
という意味ですよね

もともとマルチスレッドで Haskell のソースコードを作っていたら、
実行時に勝手に HT に振り分けてくれないのですか?

そんな単純ではない?
677デフォルトの名無しさん:2012/02/18(土) 23:00:34.29
文字列で日本語使えないのでしょうか?
678675:2012/02/18(土) 23:03:27.58
>>676
近所でICCでMPIをやってる人がいたが、期待したほど速くならなくて困ってた
なので、Haskellもそんなにうまく速くなるわけではないと思ってるけど、
速くなるのなら型システムよりもすごいことなんじゃないかと思う
679デフォルトの名無しさん:2012/02/18(土) 23:11:59.78
>>677
もう少し問題をハッキリさせようか

今の Haskell は標準で UTF-8 でエンコードされた文字データを処理できる
ここでいう処理というのは、Char 型の変数にデータを束縛できるという意味

>>677 は何が問題だと感じている?

あと環境も教えてくれ(OS やコンパイラのバージョンなど)
680デフォルトの名無しさん:2012/02/18(土) 23:19:22.20
>>678
例えば、Haskell で repa を使って画像データを配列に読み込んで、
それに対してぼかし処理とか FFT 処理とか施したりする場合、
2コアCPUを使って RTS オプション -N1 と -N2 とでは全く処理速度が違う
驚くと同時に感動すら覚える

HTを持つCPUも、コアが増えたのと同程度とは期待していないが、
1.5倍程度は速くならないかなと思ってたんだけど

だれか試してくれないかな
681デフォルトの名無しさん:2012/02/18(土) 23:25:09.94
>>679
CSVファイル(Excelで出力したShift_JIS)を読み込んで、lines関数で分割した後、id関数に入れて、そのままunlinesしてファイルに出力したら日本語の場所が文字化けしてるです
Haskellそのものの仕様で使えないのか、入力系かParsecか出力系のエラーで使えないのか、特殊な文字列データ型を入れれば使えるのか知りたいです
Windows7、The Glorious Glasgow Haskell Compilation System, version 6.12.3 です

もしHaskellそのものの仕様で日本語が使えないのならCSVファイルを編集して日本語部分を全部ASCIIコードでローマ字にします
682デフォルトの名無しさん:2012/02/18(土) 23:44:47.47
>>681
下記のコードで全く問題なく Shift_JIS をロードして Shift_JIS で保存された

writeFile "test2.txt" =<< return . unlines . id . lines =<< readFile "test.txt"

[環境]
Windows7
GHC 7.4.1
683デフォルトの名無しさん:2012/02/18(土) 23:49:00.05
>>680
repaすごいな
ここまでマルチコア意識してるなら速くなりそうな気がするな
684682:2012/02/19(日) 00:40:54.82
>>681
ちなみに、>>682 のコードの id の部分を map (take 3) とかにした場合、
保存されたテキストを Shift_JIS として解釈する(開く)と文字化けして見える

何も加工しなければ、読み込んだデータの形のまま保存される
(例えば SQL で Shift_JIS の文字列を読み込んでそのまま出力する場合も含む)

文字単位で加工したければ、
読み込み前に CSV ファイルを予め UTF-8 に変換しておくか、
あるいは読み込んだ後に UTF-8 に変換する必要がある
(例えば iconv パッケージを使う)

そして、例えば Data.String.UTF8(utf8-stringパッケージ)を使って加工するとか
685デフォルトの名無しさん:2012/02/19(日) 01:50:54.96
>>684
ParsecでCSVファイルの解析をためしたら文字化けしてたから、idとかに変えていろいろ試してました
これ結局、Parsecを間に入れてファイル入出力する場合は文字コードの変換を明示しないとダメということなんですね
686682:2012/02/19(日) 02:13:53.28
>>685
そう
Parsec で日本語を処理したいのなら、処理前に UTF-8 にエンコードしないとダメ

参考になりそうなページ
http://snak.tdiary.net/20110104.html
687デフォルトの名無しさん:2012/02/19(日) 09:55:24.28
あれ、Hackage落ちてる?
688デフォルトの名無しさん:2012/02/19(日) 15:43:45.81
諸君、お薦めのライブラリは何かね?
689デフォルトの名無しさん:2012/02/19(日) 15:51:43.82
prelude
690デフォルトの名無しさん:2012/02/19(日) 15:58:31.27
Data.List もなかなか
691デフォルトの名無しさん:2012/02/19(日) 15:58:44.91
こやつめ!ハハッ!
692デフォルトの名無しさん:2012/02/19(日) 16:00:51.90
僕はForeignちゃん!
693デフォルトの名無しさん:2012/02/19(日) 21:52:36.96
すみません、質問させてください。以下のコードが、なぜか意図した通りに動作しません。
(一応なるべく簡略化したので、このコード自体に深い意味はないです)

combination n r =div (product [1..n]) (product [1..r] * product [1..n-r])
f n = length (takeWhile (<=4000) (map (combination n) [1..5] ))
hoge = [n - f n | n<-[20]]

私はこの hoge を [20 - f 20] のつもりで書きました。GHCで [20 - f 20] と入力すると 17 と返ってくるので、 hoge は [17] になっていてほしいです。
なのに、なぜか hoge と入力すると [15] が返ってきます。どなたかどこが誤っているのかわかる方がいらっしゃったら教えていただけないでしょうか。
694デフォルトの名無しさん:2012/02/19(日) 22:36:50.85
>>693
product [1..20]がオーバーフローしている。

ghciで [20 - f 20] としたときはたぶんf 20の20がIntegerとして評価されているからオーバーフローが生じていない。
ghciで[20 - f (20 :: Integer)]と[20 - f (20::Int)]を比較して、考えれば、言っていることが分かるだろう。
695デフォルトの名無しさん:2012/02/19(日) 22:39:24.02
>>693
原因は >>694 の通り

解決方法の一つは、f 関数内で length 関数の代わりに genericLength 関数を使う
696694:2012/02/19(日) 22:43:26.21
import Data.ListしてlengthのかわりにgenericLengthを使えば解決するみたい
697695:2012/02/19(日) 22:43:45.05
すまん、
その >>693 の(型シグネチャを省いた)例なら、
genericLength 関数を使えば自動的に全て解決するという意味

実際のコードで型シグネチャを書いてる場合、
例えば combination 関数の型が Int -> Int なら、
それも Integer に直す必要がある
698694:2012/02/19(日) 22:44:07.36
だから、リロードしろとorz
699デフォルトの名無しさん:2012/02/19(日) 22:54:59.05
やっぱりIntは撲滅すべきだわ
700デフォルトの名無しさん:2012/02/19(日) 22:58:28.08
単一の式では、nとnは同じ型でないといけないけど、
20と20が同じ型である必要はないってことだね
「lengthがIntegral a => a型ではなくInt型を返すのはまったく馬鹿げたこと」
だっけか
701デフォルトの名無しさん:2012/02/19(日) 23:21:56.89
>>699
それは無い

ただ、オーバーフローしたのならしたと分かるような、
デバッグ用の RTS オプションとかあるといいな
702693:2012/02/19(日) 23:52:01.42
>>694-697,700
なるほど、そういうことでしたか。型宣言は省略していたので、おっしゃる通り genericLength という関数を(初めて見ました)使うことで解決しました。
質問前にコードを書き換えて実験していたとき、 hoge = [f n | n<-[20]] とするとちゃんと [f 20] に一致するのが不思議だったのですが、それも >>700 を読んで合点がいきました。
単に f n と書くと Integer 型として扱われるが、n - f n と書いた場合には n が Int 型になってしまっていたのですね。それでオーバーフローしたと。
自分では絶対に気づきませんでした…。お三方(お二方?)ご親切にありがとうございます。
703デフォルトの名無しさん:2012/02/20(月) 12:44:31.59
windowsでgtk2hsの最新版に-threadedつけたら普通にぶっ壊れてワロタ
その問題は直ったって言ったじゃないですかー!
704デフォルトの名無しさん:2012/02/22(水) 01:04:11.99
wondowにこだわってたら、面倒は多いだろうからな。
705デフォルトの名無しさん:2012/02/22(水) 18:49:36.88
>>703
Haskellに限らず、gtk全般がwindowsと相性が悪いと思うのは私だけでしょうか?
706デフォルトの名無しさん:2012/02/22(水) 19:12:47.80
wxWisgets の方が安定してるような感じはするな

今は wxpack もあって、Haskell で使うのも、
特別なことをしなければ gtk2hs 並に簡単になった
707デフォルトの名無しさん:2012/02/22(水) 19:21:08.18
GUIはVBやVCでインターフェイス作って、パイプ通してHaskell使ってる
708デフォルトの名無しさん:2012/02/22(水) 19:31:59.91
wxHaskellっててっきり開発止まってるんだと思ってたら
一月に新しいの出てんのね
ちょっと移るか・・・
709デフォルトの名無しさん:2012/02/23(木) 21:38:20.07
permutationパッケージって不便じゃない?
重複もある要素群から組合せや順列作りたい時どうするの?
710デフォルトの名無しさん:2012/02/24(金) 00:08:55.34
Haskellの名前空間ってどうなってんの?
二つの別のモジュールで同名の関数定義してたらmoduleName.は略せない
711はちみつ餃子 ◆8X2XSCHEME :2012/02/24(金) 00:48:25.04
候補が複数ある関数を使ったときだけエラーにすればいいと思うんだよな。
実際に使ってない関数で衝突があってもどうでもいいじゃん。
712デフォルトの名無しさん:2012/02/24(金) 03:21:55.39
>>710-711
それぞれのモジュールをインポートするときに
インポートする関数名を明示的に指定するんじゃだめなのかね?
713デフォルトの名無しさん:2012/02/24(金) 07:30:30.90
>>710
指摘している問題箇所がよく分からない
こちらの環境(GHC 7.4.1)で試したら、全く問題なかったんだが

-----[ Mod1.hs ]-----
module Mod1 (t1, t2) where
t1 = (*3)
t2 = (+7)

-----[ Mod2.hs ]-----
module Mod2 (t1, t3) where
t1 = (*5)
t3 = (+13)

-----[ ModC.hs ]-----
module ModC where
import Mod1
import Mod2
f = t2
g = t3

ghci でエラーも無く ModC をロードできる
当然、関数 f や g は普通に使える
また、ghc で実行ファイルやライブラリにコンパイルする事もできる

ModC で関数 t1 を使おうとすると Ambiguous occurrence エラーが出る
その場合はモジュールを明示するか、import でエイリアス名を指定すれば良い

何が問題なんだ?
714デフォルトの名無しさん:2012/02/25(土) 17:50:44.36
Cabal の挙動がいまいちよく分かりません

*.cabal ファイルに例えば以下のような記述があった場合

flag ichigo
  default: False

if flag(ichigo)
  ---[ A ]---
else
  ---[ B ]---

configure に [A] が通るのか [B] が通るのか、どちらなのでしょうか
715デフォルトの名無しさん:2012/02/26(日) 18:39:03.77
forallってオプションと共に用いて
型の決め打ちを段階的に遅延してもらうものだと思えばいいの?
716デフォルトの名無しさん:2012/02/27(月) 07:24:50.28
>>715
どうしてそう思う?

(違うと言ってるんじゃなくて、単純にその考え方に興味があるだけです)
717デフォルトの名無しさん:2012/02/27(月) 08:03:50.64
id:: a -> a

(\f -> (f 1,f "1")) id

No instance for (Num [Char])
arising from the literal `1' at <interactive>
Possible fix: add an instance declaration for (Num [Char])
In the first argument of `f', namely `1'
In the expression: f 1
In the expression: (f 1, f "1")

これがエラーになるのは
コンパイル時に最初に評価したほうの型で固定しちゃうからでしょう?

最初に解釈した段階でid 1だから
id::Int -> Int
で固定しちゃう

次にid "1" をみてなんだこりゃ?
id:: String -> Stringなんて聞いたこと無いぞ!とコンパイラが怒り出す

この悲劇を回避するために
決め打ちは一段階待ってくれ
a -> a のまま進んでくれ
ってのがforallとXRank2Typesオプションのセットの役目なんじゃないの?

評価の遅延じゃん?
実行の遅延評価じゃなくてコンパイル時の型の遅延評価だから
メタ遅延評価的な
718デフォルトの名無しさん:2012/02/27(月) 12:45:29.31
評価順序によらないはずなのに「最初に評価したほうの型」ってなるのが面白いね。
値を遅延評価できても、型も遅延評価できるとは限らないんだな。
719デフォルトの名無しさん:2012/02/27(月) 13:20:52.44
あくまでコンパイル時の話だし
静的に型付けて片付ける型の言語だし
そのくらい大目に見てやれよ
720 [―{}@{}@{}-] デフォルトの名無しさん:2012/02/27(月) 17:39:59.79
決め打ちするのはその通りだけど順番は関係ないよ
どっちから型を付けても(エラーメッセージ以外は)同じ結果になる
721デフォルトの名無しさん:2012/02/27(月) 21:39:35.38
forall の話が出たんで、理解をより深めようと調べてたんだけど、
http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
このページで分からない部分がある

[Explaining the term existential] のセンテンスの
「But we got almost the same behaviour above using datatypes. Let's declare one.」
の直前まではなんとか分かった

forall = 積集合
exists = 和集合(Haskell の構文には無い)

というのも、納得はできないが、とりあえずそういうものだと見なす事にする
で、そのすぐ下の「MkT :: forall a. a -> T」 の意味を説明している部分がよく分からない

これまでの話の流れからすると、forall a. (a -> T) というのが、
どういう型(を意味する集合)の積集合になるかを考えれば良いんだよな

つまり、

Int -> T という型を意味する集合が持つ要素
String -> T という型を意味する集合が持つ要素
・・・

などに共通する要素だけを持つ型が forall a. a -> T なんだよな
ここまでは合ってる?

で、その共通する要素って、ボトム以外に具体的にどういうものがあるのかな
と考えてみると・・・ よく分からない

「何かを入力して型 T の値を得る関数」というのがそれかなと初め思ったけど、
じゃあこれは例えば「Int -> T という型を意味する集合が持つ要素」に含まれているのか
と考えると、なんか違う気がする
722デフォルトの名無しさん:2012/02/27(月) 23:11:20.23
エラー
(\f -> (f 1, f "1")) id

積集合
(\(f,f') -> (f 1, f' "1")) (id,id)

和集合
id' (Left x) = Left (id x)
id' (Right x) = Right (id x)
(\f -> (f (Left 1), f (Right "1"))) id'

集合が有限なら、forallとexistsは不要です。
723デフォルトの名無しさん:2012/02/27(月) 23:52:14.92
時間の無駄
724デフォルトの名無しさん:2012/02/28(火) 00:04:14.04
無限リストを扱えるから限定子が必要 という説明からはじめてくれないと困る
725デフォルトの名無しさん:2012/02/28(火) 03:02:25.61
>>721
俺は共通する要素とか集合って考えるより、
特定の型に依存しない性質を含んだ関数って考えた方がピンとくるな。

>で、その共通する要素って、ボトム以外に具体的にどういうものがあるのかな
要するにT aという型のコンテナTに対して、格納しているa型の値に直接触れずに、
コンテナの構造だけを変えたり(flatten :: forall a. Tree a -> [a]、tail :: forall a. [a] -> [a]とか)、
コンテナ自体の情報を返す(length :: forall a. [a] -> Int)類の関数。
特にリストのhead、(!)とか、タプルならfst、sndみたいに値を取り出すような関数も、
中身に触れなければ型に依存しない性質は保たれるってのは重要。
726デフォルトの名無しさん:2012/02/28(火) 07:44:27.79
>>722
それは俺(>>721)に対する返信?

もしそうなら、>>721 のページで言ってる forall = 積集合 という場合の集合は、
{⊥, 0, -1, 1, -2, 2, ...} を要素に持つInt型という名前の集合
{⊥, True, False } を要素に持つBool型という名前の集合
{⊥, "kyu-ri", "daikon", ...} を要素に持つString型という名前の集合
・・・
という意味の集合だと思うんだけど

で、例えば forall a. a は「全ての型(集合)の積集合」だから、
{⊥} を要素に持つ集合、つまり⊥しか値を取り得ない型になる

これと >>722 との繋がりがよく分からない(繋がった話ならという場合だけど)


>>725
同じだ、俺も今まで似たような考え方でやってきたんだ

それはそれとして、では >>721 のページに載っている考え方だと、
MkT :: forall a. a -> T はどう説明できるのかなという話
727デフォルトの名無しさん:2012/02/28(火) 10:03:32.17
>>726
Int型はIntの値の集合ではなく、Intの値を取り出せるデータ構造の集合だ、と定義すればいい。
例えば、0というデータから取り出せるのはIntだけでなく、Doubleも取り出せる。
forall a. a->TからはInt->TやDouble->Tなどを取り出せる。
728デフォルトの名無しさん:2012/02/28(火) 12:47:20.41
>>727
いや、ちょっと待って
そうやって勝手に話の前提を変えた場合、>>721 のリンク先の話は
ちゃんと整合性を保って説明できるのだろうか
(整合性を保って説明できるように隠れた定義を暴き出してくれたのなら大変有り難いが)

リンク先ではハッキリと

Bool is the set {True, False, ⊥},
Integer is the set of integers (and bottom),
String is the set of all possible strings (and bottom),
and so on.

と定義されていて、これを前提にしてその後の話が続いている


> forall a. a->TからはInt->TやDouble->Tなどを取り出せる。

もしそうだとすると、forall a. a からは Int も Double も取り出せるということ?
729デフォルトの名無しさん:2012/02/28(火) 13:07:28.91
⊥しか取りえないってのは間違い。
MkT :: forall a. a -> Tはどんな値でも取ってT型を返す関数。
全称量化することで、型パラメータaが取り得る全ての型に共通の性質だけにしか言及できなくなる。
で、結局の所、⊥か、それ以外の何かが入ってる、としか言えなくなる。
(もちろんisBottomみたいな関数は定義できないから、実質何が入ってるかは不明)
forallが積集合云々ってのは、このことを言いたいんじゃないかと思う、多分。

一応、
foo (MkT x) = x :: T -> a
bar (MkT x) = id x :: T -> a
dup (MkT x) = (x, x) :: T -> (a, a)
みたいな関数は定義できる。
まぁT型の定義じゃ意味のある関数は定義できないけれど、値を取り出して関数適用するだけならおkだから、
型制約付けといたり、関数とセットで入れとくと、OOPっぽいポリモーフィズムできるようになったりする。
ttp://www.kotha.net/ghcguide_ja/latest/data-type-extensions.html#existential-quantification

(件のページのNotesみて初めて知ったけど、WHNFに簡約はできるって発想は無かった…)
730デフォルトの名無しさん:2012/02/28(火) 13:59:49.98
初心者で申し訳ありません。
ggrksとか言わないで下さい。ググッた結果↓
⊥ に一致する情報は見つかりませんでした。
731デフォルトの名無しさん:2012/02/28(火) 20:16:28.02
>>730
⊥ はボトムと読みます
732デフォルトの名無しさん:2012/02/28(火) 21:17:38.37
* LLクズがウォーミングアップを始めたようです! *
733デフォルトの名無しさん:2012/02/28(火) 23:59:59.80
学部時代にHaskellに没頭していた俺ですが、今では立派なPython厨です
734デフォルトの名無しさん:2012/02/29(水) 02:29:52.31
Web+DB誌に山本和彦によるHaskell入門が載ってるみたいだけど、読む価値ありますか?
735デフォルトの名無しさん:2012/02/29(水) 03:25:58.19
雑誌の言語紹介記事なんてのは布教用だから、
Haskellerが読むようなものじゃない。
736デフォルトの名無しさん:2012/02/29(水) 06:23:56.45
その記事で、Learn You a Haskell for Great Good!の訳本出るって書いてる
『すごいHaskell たのしく学ぼう!』
* 田中英行、村主崇行訳
* オーム社
* 2012年5月発売予定

まあいいんだけど、タイトルダサいな。
737デフォルトの名無しさん:2012/02/29(水) 07:53:36.61
>>729
> 全称量化することで、型パラメータaが取り得る全ての型に共通の性質だけにしか言及できなくなる。

>>726 でも言ったが、俺も普段は似たような考え方で forall を扱っている
しかし、この考え方とリンク先のページで述べられている考え方との整合性がなんか上手く取れないんだ
(たぶん同じ forall について我々とリンク先は別の視点、捉え方で見ていると思うんだ)

> ⊥しか取りえないってのは間違い。

例えば >>726 を繰り返すが
(読み返してみて、誤解を与える表現に気づいたので括弧は外した)

⊥, 0, -1, 1, -2, 2, ... を要素に持つInt型という名前の集合
⊥, True, False を要素に持つBool型という名前の集合
⊥, "kyu-ri", "daikon", ... を要素に持つString型という名前の集合

ゆえに forall a. a は ⊥ を要素に持つ(名前は知らん)集合

という考え方を取っている(これはハッキリ書かれている、と俺は思う)

貴方や俺が普段取っている「型パラメータaが取り得る全ての型に共通の性質」という考え方ならば、
例えば forall a. (Show a) => a とすれば、その共通する性質をさらに (Show a) と絞り込む
という風に素直に考えられ、実際のコンパイラの挙動とも合致する

しかし、リンク先の考え方だと、forall a. a で {⊥} という集合なら、
これに対して (Show a) という性質で絞り込むことがちょっと想像できない
forall a. a -> T についても同じ

リンク先の言いたいことは何なんだろうというのが疑問なんだが、
申し訳ない >>729 でもまだ疑問が解消されない
(やっぱりそう考えた方が今はまだ分かりやすいな、という気持ちは再確認できたが)
738デフォルトの名無しさん:2012/02/29(水) 16:00:11.89
729は「aの性質に言及するのをやめれば、共通の要素を作れる」と言っている
737は「aの性質を考えると、共通の要素は⊥しかない」と言っている

つまり、型を考えるのをやめれば便利なものを作れるが、
型を考えると、そんな便利なものは存在しないということを証明できる
739デフォルトの名無しさん:2012/02/29(水) 19:01:47.59
>>738
ごめん、どういうことなのか、ちょっと分からない
混乱してる

>>737(俺)が言ってるんじゃなくて、言ってるのは俺が示したリンク先のページだよ
そして、aの性質を考えるとじゃなくて、forall の性質=積集合を考えると、ね
a は単に forall に束縛された型変数で、重要な性質を持ってるのは forall の方だと俺は思う


よく分からないけど、俺の疑問の解消に少しでも繋がるような
何か証明ができるのなら、是非してみてほしい
お願いする
740デフォルトの名無しさん:2012/02/29(水) 20:01:40.01
>>739
じゃあMkTという関数があってMkTの型(a->T)は(aに関しては)重要ではないとする
重要ではないので適当に
MkT ∈ (Int->T)
MkT ∈ (Bool->T)
MkT ∈ (String->T)
・・・
ということにすればMkT ∈ (forall a. (a->T))
だから(forall a. (a->T))には⊥以外の要素が入っている
741デフォルトの名無しさん:2012/02/29(水) 20:17:30.41
>>740
確認したいんだが、

MkT ∈ (Int->T)
MkT ∈ (Bool->T)
MkT ∈ (String->T)
・・・

これは全て AND で結ばれているんだよな
つまり、全ての積集合を意味しているんだよな

{MkT ∈ (Int->T)} AND {MkT ∈ (Bool->T)} AND {MkT ∈ (String->T)} ...
742デフォルトの名無しさん:2012/02/29(水) 20:46:56.98
>>741
そうだね
ANDだね
743デフォルトの名無しさん:2012/02/29(水) 20:58:30.82
積じゃなくて直積じゃね?
744デフォルトの名無しさん:2012/02/29(水) 21:00:47.10
>>743
どうして?
745デフォルトの名無しさん:2012/02/29(水) 21:21:11.49
ごめん勘違い、そこは積集合であってる
746デフォルトの名無しさん:2012/03/01(木) 02:57:49.52
(Int -> T)は
{ ⊥, (\x -> T), (\x -> let _ = x + 1 in T), ... }

(String -> T)は
{ ⊥, (\x -> T), (\x -> let _ = x ++ "foo" in T), ... }

forall a. (a -> T)は
{ ⊥, (\x -> T) }
747デフォルトの名無しさん:2012/03/01(木) 03:05:14.44
ちょっと間違い
forall a. (a -> T)は
{ ⊥, (\x -> T), (\x -> let _ = x in T), ... }
だった
つまり書く集合の内xをIntなどの具体的な型として
扱っていない項だけが残る
748デフォルトの名無しさん:2012/03/01(木) 07:23:19.60
>>746, >>747
すげー分かりやすかった

なるほど、forall a. a の時のように、
ちゃんとそれぞれの型の場合の取り得る値の集合の積で考えられるんだ
合点がいった

ありがと
スッキリしたから、もう少し先まで読み進めてみる
749デフォルトの名無しさん:2012/03/01(木) 12:01:47.26
【言語別成果物】
PHP「掲示板作りました!」
Ruby「Railsで住所管理アプリ作りました!」
Java「帳票管理ソフト作りました!」
ActionScript「ゲーム作りました!」
Lisp「Lisp作りました!」
Haskell「美しい言語だ…(成果物無し」

Haskellやる理由ってエンジニアとしてのステータスなんだよね
昔の言語LISPに触れるとか、古参気取ったり
インテリンゲンジャを気取るためにHaskellやってますとかね
馬鹿じゃねーの?wwwwwwwwwwwww
死ねよいいから
お前ら目さませよクズ!?!!?
本当に!!

おまえらさ!? 
Haskellやってて
名に作ったの?

クズHaskell使い「作ったとかじゃなくて・・・そもそも何故作るのか」

スキルアップ(笑)で終わってると思うよお前ら

Matzの布教活動に釣られたクズ当然だなwwwwwwwwwwwwwwwwwwwwwwwwwwww
750デフォルトの名無しさん:2012/03/01(木) 12:07:21.59
> インテリンゲンジャ
これは新しい
751デフォルトの名無しさん:2012/03/01(木) 12:09:43.91
難しいがかっこいい
マイナーがかっこいい

とか美徳感じてるクズばっかりだからな
752デフォルトの名無しさん:2012/03/01(木) 12:22:52.87
また、pearl忍者が復活したのか。偏狭な視点と幼稚臭い書き込みですぐ分かる。
753デフォルトの名無しさん:2012/03/01(木) 12:34:25.86
インテリゲイシャとかいいな
高学歴娼婦みたいで
754デフォルトの名無しさん:2012/03/01(木) 12:46:48.45
テルマエ・ロマエにそんなのが出てくるな
755はちみつ餃子 ◆8X2XSCHEME :2012/03/01(木) 13:27:09.96
「験者 (げんじゃ)」かな? 僧侶や修験者のこと。

「げんしゃ」だと資産家のことを意味する方言 (古語) 。
http://www.weblio.jp/content/%E3%81%92%E3%82%93%E3%81%97%E3%82%83
お高くとまっている様子を言うこともあるのでこの場合はこっちの方が妥当かも。
756デフォルトの名無しさん:2012/03/01(木) 13:34:42.64
>>753
AVで笛吹いたりするのか
757デフォルトの名無しさん:2012/03/01(木) 14:11:47.76
>>752
>>Lisp「Lisp作りました!」

この一行の手抜きで、忍者ではないと判る。
758デフォルトの名無しさん:2012/03/01(木) 14:42:54.03
ダークス創ったじゃないか
759デフォルトの名無しさん:2012/03/01(木) 16:02:15.78
お前が作ったわけじゃないだろ
話の主軸を見誤るな
760デフォルトの名無しさん:2012/03/01(木) 16:34:30.58
成果を増やすより無駄を減らすことに興味があるんだろう
特に、数学を知らないことで無駄に遠回りしてしまうことを恐れている
761デフォルトの名無しさん:2012/03/01(木) 16:40:52.53
無駄を減らす事は重要だな。
パイオニアがやる事とは違うが。
762デフォルトの名無しさん:2012/03/01(木) 17:01:30.78
山本和彦のLISPにいた頃には得られなかった悟りが開けたみたいだなHaskellのおかげで
763デフォルトの名無しさん:2012/03/01(木) 17:07:15.13
こんにちは
Haskellできる人は凄いと聞きました
http://macintoshgarden.org/sites/macintoshgarden.org/files/screenshots/Traitor_heads_0.jpg
このゲームをWindowsに移植してください
お願いです;;
764デフォルトの名無しさん:2012/03/01(木) 20:36:10.70
Macでこんなゲームがあったんか
765デフォルトの名無しさん:2012/03/01(木) 21:40:37.11
>>749
掲示板とか住所管理とかしょぼいのばっかだな、、、
766デフォルトの名無しさん:2012/03/01(木) 21:48:26.24
yesodのチュートリアルでblogとかtwitterもどき作る例みたいなものぐらいはあっていいかもな
そういえばrailsが出た頃は15分でblog作るデモとかあったな
実用性のアピールにはあぁいうインパクト大事
767デフォルトの名無しさん:2012/03/01(木) 21:54:11.82
だよな

なんかさ 高速化〜言語がどうたら とか難しい話言われてもちっともうれしくねえし
そういうのつまんなくね

ゲームとかブログとか作るとかの法が楽しいし
本当に馬鹿だよな

最適化とか高速化とかつまんね
〜〜を返してみる とか やめて欲しい

実用性のインパクトが大事

ニコニコ動画はフラッシュプレイヤー作ってますとかインパクトなさすぎるのとおなじだね
768デフォルトの名無しさん:2012/03/01(木) 21:54:55.57
正直さが足りない
無理してる布教に釣られたクズばっかり
769デフォルトの名無しさん:2012/03/01(木) 22:02:06.47
O'REILLY の「Developing Web Applications with Haskell and Yesod」って、
O'REILLY のサイトだと 300 ページって書かれてるのに、
他の Amazon とかだと 100 ページつて書かれてるんだよな

どっちだよ
100 ページってハンドブック?
770デフォルトの名無しさん:2012/03/01(木) 22:11:32.18
>>755
インテリゲンチャのタイポだろ。なんだ修験者って。
771デフォルトの名無しさん:2012/03/01(木) 22:50:53.25
それも淡々と作るというより
バグやエラーをあえて発生させそれを強い型付けとかランダムテストを使いながら
確実に取り除いていく様子を見せるようなデモがいいだろうな
簡単に作れるとかだと「じゃあrailsでいいよね」とかいうオチになるから
772デフォルトの名無しさん:2012/03/02(金) 01:29:04.91
それよりKent BeckとかtwadaあたりがHaskellに乗り換えたけどいいよって言うだけで十分じゃないか?
あとはIIJあたりも社内Haskellで統一して、MOGOKやめてYesodのサービス始めれば援護になる。
なんでそうならないんだろうね。
773デフォルトの名無しさん:2012/03/02(金) 09:06:18.04
「しゅげんじゃ」も知らんのか。
774デフォルトの名無しさん:2012/03/02(金) 10:06:46.62
インテリ顔射
775デフォルトの名無しさん:2012/03/02(金) 21:14:41.55
NumでないとBitsに成れないって不条理じゃね?

別に四則演算なんてしなくても
ビット演算したいケースなんて普通にあるだろ

Word32でnewtipeした型をBits宣言したいけど
四則演算は禁止したい

こんなときどうすれば良いの?
776デフォルトの名無しさん:2012/03/02(金) 22:47:19.28
ttp://snak.tdiary.net/20091020.html
これ↑を読んでたんですけど
Functorのインスタンスを説明するところで((->) e)はファンクタだって記述がありました。
GHCIとかで:typeしてもエラーにしかならないんですけど
(->)ってのは普通の演算子じゃなくて、型宣言のところに出てくるアレって解釈であってますか?
よくわかってないですが、型より一段階メタな種を扱う演算子みたいな扱い??

もし可能であれば、((->) e)のFunctor実装がどんな感じになるか教えてもらえないでしょうか。
777デフォルトの名無しさん:2012/03/02(金) 23:25:53.07
>>775
Bitsクラスをただのビット列表現と解釈しているから不条理に思えるのでは?

ライブラリドキュメントにはこうハッキリと書かれている
The Bits class defines bitwise operations over integral types.
これは、integral types に対してビット演算を提供するクラスなんだよ
だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある

integral types ではない型に対してビット演算を提供するクラスは、
今のところ標準ライブラリには入っていない
(HackageDB にも、貴方の望むライブラリは今のところなさそうだ)

また、Num のクラスメソッドを使用した場合に実行時にエラーを出す方法はあるが、
GHC によるコンパイル時にエラーを出す方法は、これまた今のところない

よって、そのようなビット列表現および演算するクラスが必要なら、
残念ながら自作するしかない
778777:2012/03/02(金) 23:27:31.24
>>777
訂正

誤) だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある

正) だから fromInteger 関数を持つ Num クラスのインスタンスである必要がある
779デフォルトの名無しさん:2012/03/02(金) 23:29:54.57
サンクス エニウェイ
780777:2012/03/03(土) 00:09:57.84
>>776
> GHCIとかで:typeしてもエラーにしかならないんですけど

では、そのすぐ上に Either e も「Functor のインスタンス」だという説明がありますが、
これも :type を試されましたか?

エラーが出ますよね
だって、Either も (->) と同じように関数や演算子じゃないから

「〜は*のインスタンス」と言った場合、〜の部分には「型」がきます

型の情報は :type では得られません(:type は値の型情報を得るもの)
型の情報は :info などで得られます
ただし、正確には :info には型ではなく型構築子を指定しないといけません
(たとえば :info Either e ではなく :info Either)

と言うことで、((->) e) は単なる型であり、意味上は何も特別なことはありません
試しに :info (->) をすれば、((->) r) 型が Functor のインスタンスだと分かります

正確に言えば (->) が種 * -> * -> * の型で、((->) e) が種 * -> * の型です


((->) e) 型のFunctor実装は処理系依存でライブラリでは公開されていませんが、
次のように解釈できるような実装になっているはずです

instance Functor ((->) e) where
  fmup f g = f . g
781780:2012/03/03(土) 00:15:43.68
>>780
くそっ、また訂正だ

誤) fmup f g = f . g

正) fmap f g = f . g
782デフォルトの名無しさん:2012/03/03(土) 00:31:28.38
>>776
instance Functor ((->) e) where
fmap = (.)
783デフォルトの名無しさん:2012/03/03(土) 00:37:41.58
サンクス エニウェイ
784デフォルトの名無しさん:2012/03/03(土) 00:48:51.17
>>780 >>782
なるほど、型と値をごっちゃに考えてたせいで要領を得ない質問になってました。
手がかりは頂いたので、もうちょっと考えてみます。
詳しい解説ありがとうございました。
785780:2012/03/03(土) 00:56:05.16
>>784
手がかりついでに

>>776
> (->)ってのは普通の演算子じゃなくて、型宣言のところに出てくるアレって解釈であってますか?
> よくわかってないですが、型より一段階メタな種を扱う演算子みたいな扱い??

(->) が演算子(関数)ではなく、種 * -> * -> * の型であることは先ほど言いましたが、
これは同時に「型構築子」とも暗に言いました((->) e は型構築子ではありませんよ)

意味上は特別なことはありません、単なる型構築子です

だから例えば f :: Int -> String -> Bool -> Maybe Char という型の関数は、
本当は f :: (->) Int ((->) String ((->) Bool (Maybe Char))) と型シノニムを書くべきで、
でも何も特別なことをしなくても中置演算子のように書けるのは一種の構文糖衣なんです

本来、アルファベットではなく演算子の形をした識別子を型構築子として使って中置したかったら、
識別子をコロンで始めないといけませんから(:* とか :+: とか :-> とか)
786デフォルトの名無しさん:2012/03/03(土) 09:52:52.83
((->) e)はFunctorだと言わなくても、(.)はfmapだと言えばいいのでは

($)は(>>=)だとか($!)も(>>=)だとか
787デフォルトの名無しさん:2012/03/03(土) 12:18:55.74
>>786
> ((->) e)はFunctorだと言わなくても、(.)はfmapだと言えばいいのでは

((->) e) はFunctorだと言うことと、(.) はfmapだと言うことは、君の中では排他的なのか?

言わんとしていることが全く異なる両者を比較することがおかしいと思うんだが

Functorな例を挙げる文脈で ((->) e) はFunctorだと言うことは至極自然だと思うぞ
788デフォルトの名無しさん:2012/03/03(土) 13:10:26.96
ああ、やっとわかった、(,)って型構築子でもあるのか。
データ構築子としてしか知らなかったから(->)の例と辻褄が合わなくて混乱してた。
789780:2012/03/03(土) 13:27:32.72
>>776
>>777 で次のように言いましたが、間違ってました
> ((->) e) 型のFunctor実装は処理系依存でライブラリでは公開されていませんが

標準ライブラリ内の Control.Monad.Instances モジュールで定義されていました

instance Functor ((->) r) where
  fmap = (.)

このモジュールが読み込まれていないと、:i (->) もエラーが出ますね


>>788
そうなんですよね
>>780 で「そのすぐ上に Either e も」と言いましたが、
リンク先のページでは実際はすぐ上のは (,) の例だったんです
が、混乱させるかなと思って敢えて一つ飛ばして無視しました
790デフォルトの名無しさん:2012/03/03(土) 13:33:31.20
>>786
「排他的なのか」は言い過ぎた、すまない

ただやっぱり両者は、どちらを言えばいいかは文脈によると思う

((->) e)がFunctorだと言うのは、(Functor a) => というコンテキストにおいて
型変数 a に ((->) e) 型を束縛できるということを意味している

で、そのようなコンテキストで型変数 a に ((->) e) 型を束縛したとき、
その a 型の値に対する fmap 関数の実際の振る舞いはどうかと言う場合に
fmap = (.) であると言える

前者は「意味」の文脈で、後者は「実装」の文脈であると言っていいと思う

質問者が読んでいたものは、言い換えれば
(Functor a) => というコンテキストにおいて型変数 a に束縛できるものの例だ
だから、やはりこの場合は ((->) e) はFunctorだと言う方がより適していると思う

791デフォルトの名無しさん:2012/03/03(土) 16:54:04.00
標準ではinstance宣言に型シノニムや特定の型が使えないのは

これは特定の型にアイデンティティを与えているから
newtypeを使うべきだという設計思想なのでしょうか?


SomeTypeではsomefunがこんなんで
(SomeType,SomeType)の時はsomefunは特別にこういう感じにしたい
なんてトリガーのような真似したい時は
やはりnewtype SomeTypePair = SomeTypePair (SomeType,SomeType)
などと一々作らないといけないのでしょうか?

と書いてて思ったんですが

Haskellに於けるオーバーロードとは
・共通属性を抽出して型クラスを策定
・newtype or data宣言
・その型で先の型クラスのinstance宣言
という一連の作業でするものなのですか?
792デフォルトの名無しさん:2012/03/03(土) 17:22:56.38
>>791
言っている事がいまいちよく分からないが・・・

instance宣言に型シノニムが使えないのは、
次のような記述ができないのと同じ理由だと思う

data TTT = Hoge Int

eq :: (Eq a) => a -> a -> Bool -- 誤った記述
eq (Hoge x) (Hoge y) = x == y

これができないのは、実際に表示されるエラーメッセージが示すように、
型変数 a を TTT 型と推論できないからだ

これを踏まえて Eq クラスのインスタンスにした場合を考えてみると、

instance Eq TTT where
 -- (Eq a) => a -> a -> Bool
 (Hoge x) == (Hoge y) = x == y

先ほどと同じ理由で、コメント部分の型シノニムの記述は誤り

かといって、TTT -> TTT -> Bool という型シノニムは、
Eq クラスのクラスメソッド (==) の型シノニムとは異なる

従って、型シノニムを「いかようにも書きようがない」


もし質問の意図が違うのだったら申し訳ない
793デフォルトの名無しさん:2012/03/03(土) 17:31:50.51
日本有数のLISPハッカーがHaskellに転向して入門記事とは時代は変わったなあ。
794792:2012/03/03(土) 17:32:50.22
>>791
もしかして

data TTT = Hoge Int

instance Eq (TTT, TTT) where
(Hoge x1, Hoge y1) == (Hoge x2, Hoge y2) = x1==x1 && y2==y2

こういうことが FlexibleInstances オプションをつけないと標準ではできない理由、
つまり GHC のオプション扱いになっている Haskell の言語設計思想的なこと
を訊いているのかな?

> などと一々作らないといけないのでしょうか?

ソースコードの module 宣言の前に
{-# LANGUAGE FlexibleInstances #-} を記述するか、
ghc や ghci コマンドに -XFlexibleInstances オプションを指定すればできる
795792:2012/03/03(土) 17:39:06.80
>>791
ごめん、>>794 は無視して

なんかすげー勘違いしてた
796792:2012/03/03(土) 17:55:19.01
>>791

FlexibleInstances オプションに加えて、
OverlappingInstances オプションも必要でした(なんかおかしいと思った)

これで一般的なインスタンス宣言を特定の型でオーバーロードできる
つまり >>794 の書き方で意図したことができるはず
797デフォルトの名無しさん:2012/03/03(土) 21:53:42.99
>>792
>data TTT = Hoge Int
>eq :: (Eq a) => a -> a -> Bool -- 誤った記述
>eq (Hoge x) (Hoge y) = x == y
>これができないのは、実際に表示されるエラーメッセージが示すように、
>型変数 a を TTT 型と推論できないからだ


Eq a => なのにも関わらず、未だEqでないものを関数eqの引数にしてるからではないのですか?
798デフォルトの名無しさん:2012/03/03(土) 22:18:29.08
>>797
言葉が、というか記述が足りなかったな

data TTT = Hoge Int
     deriving Eq

eq :: (Eq a) => a -> a -> Bool
eq (Hoge x) (Hoge y) = x == y

このようにしても同じエラーがおきる

TTT 型自体は Eq のインスタンスなんだが、
eq 関数において型変数 a から TTT 型を推論できないというエラーだ
799デフォルトの名無しさん:2012/03/03(土) 23:00:20.63
>>798
これは、Intに特定されない限りHogeはTTTとは認められない
だからIntに特定されるまで私は推論を停止する

というコンパイラの主張なのでしょうか?
800デフォルトの名無しさん:2012/03/03(土) 23:21:36.37
>>799
これでも同じエラーが起きる

data TTT = Hoge Int
     deriving Eq

eq :: (Eq a) => a -> a -> Bool
eq (Hoge x) (Hoge y) =
 let x' = 3 :: Int
   y' = 2 :: Int
 in x' == x && y' == y
801デフォルトの名無しさん:2012/03/03(土) 23:24:56.59
printfデバッグ的に型情報を調べたいのですが
ghciのインタラクティブシェルなら
Prelude> :t 100
100 :: (Num t) => t
Prelude> :type 100
100 :: (Num t) => t
と出来るのですが
ソースに埋め込んだ場合の方法が分かりません
{- main.hs -}
main = ...
としたら
どのように書けばいいですか?
802デフォルトの名無しさん:2012/03/03(土) 23:41:12.09
>>801
今まで一度もまともに使ったことは無いんだが、
Data.Typable モジュールの typeOf 関数が使えるかも知れない

ただ、型変数がある型シグネチャの関数を typeOf に適用させると、
勝手に可能な特定の型に推論されてしまう
推論できない曖昧性があると例外が発生する

a = 1
show $ typeOf a

==> "Integer"
803デフォルトの名無しさん:2012/03/03(土) 23:44:03.91
途中でレスってしまった

f :: (Eq a) => a -> a -> Bool
f = (==)

show $ typeOf f

==> "() -> () -> Bool"

どういう理屈で () に推論されるのかよく分からん
可能な型の中で取りうる値が一番少ない型になるのかな・・・
804デフォルトの名無しさん:2012/03/04(日) 00:16:10.20
6.12.1環境で
import Data.Typeable
main = print $ typeOf "1"
はいけました
が、
import Data.Typeable
main = print $ typeOf 1

main = print $ typeOf (1,2,3)
などはダメですね

Haskell初日でしてghciのソースを読んでも訳がわからんです
検索キーワードを教えていただきありがとうございます
805デフォルトの名無しさん:2012/03/04(日) 01:04:30.24
>>804
> などはダメですね

さっきも言ったが、推論できない曖昧性があるとエラーが発生する

*.hs ファイル内で 1 と記述しただけ(リテラル)だと、
それが Integer なのか Int なのかハッキリしない

だからリテラルの場合は
print $ typeOf (1 :: Int)
print $ typeOf ((1,2,3) :: (Int, Integer, Double))
などと型を明示してやるといい
(文字列リテラルは、普通の場合に限れば型が特定できる)

ghci 上では、1 というリテラルは、
型が特定されない間は (Num a) => a という型変数で表現されて、
型を特定しないといけなくなると Integer 型に勝手に推論される

いずれにしても、Haskell 初心者なら、
printfデバッグ的に型情報を調べたい欲求はこらえてくれ
その必要が無いような言語設計になってるから

コンパイルが通るソースなら、落ち着いてゆっくり上から順に見ていけば、
末端に到達した時にちゃんと全ての型が正しく推論できるようになっている
型推論の練習をしてるんだという意識でソースを読むことを勧める
806デフォルトの名無しさん:2012/03/04(日) 01:26:02.09
なんでそんな苦行みたいなことしなきゃならんの?
807デフォルトの名無しさん:2012/03/04(日) 02:17:05.99
>>805
明示的に型指定するのなら、そもそも型を調べる必要性すらないですし
推論後の型情報なり推論前のジェネリックな型情報が取得できないとは思えないんですよね

とりあえず、初日ですので
レスを待ちつつ試供を続けてみます
ありがとうございました
808はちみつ餃子 ◆8X2XSCHEME :2012/03/04(日) 03:01:00.94
候補を挙げれなくはないと思うんだけど条件によっては莫大な量になりそうな気がする。
809デフォルトの名無しさん:2012/03/04(日) 06:44:48.75
>>800
確かにそうでした
でもなぜ推論できないんですか?
810デフォルトの名無しさん:2012/03/04(日) 10:58:52.73
>>809
eq :: (Eq a) => a -> a -> Bool
eq (Hoge x) (Hoge y) = ...

型変数 a から具体的な TTT 型に推論する為の道筋がない

もう少し言えば、型シグネチャ内の a は型「変数」だ
型に関する式における自由変数と言っても良い
従って、最終的には何かの具体的な型で「束縛」しないと
関数全体の型が決定できない

関数のシグネチャ内にある自由変数は、
その関数を呼ぶ側、つまり外で具体的な型を与えて束縛してやる必要がある
(型に関する式だけでなく、自由変数と言ったら普通そういうもんだ)

しかし、例示したコード片は呼び出し側で型変数 a の型を決定していない
(というかこの場合そもそも呼び出し側が無い)
決定していないにも関わらず、「関数内で」勝手に TTT 型と決めつけられている
だから、ちょっと待て、まだ決定できんだろうがハゲ、と怒られる


こういうことがある中で、インスタンス宣言にシグネチャが書けると、
(Eq a) => a -> a -> Bool と書いても TTT -> TTT -> Bool と書いても、
どっちをとっても何かおかしいよねぇ、となる
なら書けない方が良い

・・・冷静に考えると、本当はもっと全然別の単純な理由かも知れん
(クラス宣言の方でシグネチャ書いてるんだからもう良いだろ、という理由)
811デフォルトの名無しさん:2012/03/04(日) 11:07:47.81
>>807
> 明示的に型指定するのなら、そもそも型を調べる必要性すらないですし

だから初めから明示的に書いて、型を調べる必要性を無くしましょうと暗に言ってる

そもそも、なんで型シグネチャをプログラム内で得ようとしてるの?
理由によっては何か代替案が提示できるかもしれん
812デフォルトの名無しさん:2012/03/04(日) 15:32:27.07
>>810
∀Eq a, にも関わらず∃Eq a, で話し始めてる事が開口一番詭弁になってる
ということですかね

全ての田舎での空気は美味い
何故なら僕が今立っているこの田舎の空気は最高だからだ

みたいな
813デフォルトの名無しさん:2012/03/04(日) 16:19:30.41
データ構築子はデータの演算子
型は集合
型構築子は集合の演算子
型クラスは集合の集合

まるでポインタの配列やポインタのポインタのようだ
814デフォルトの名無しさん:2012/03/04(日) 17:01:21.92
>>812
そういう事を言いたかったのではないんだが・・・
まぁ、それで自分の疑問に納得がいったのならいいと思う

大事なのは、ある考え方を以て他の関連した事柄も矛盾無く説明できるか、だから
できるのなら、どういった考え方でも問題ないと俺は思ってる
あとは気分の問題

・原発は日本を滅ぼす、即時全廃せよ

・六ヶ所村再処理工場直下に二つの活断層

・耐震基準450ガルと、著しく耐震性に欠ける施設

・大事故が起きたらチェルノブイリを遥かに越す未曽有の大惨事が

・代替は天然ガス・コンバインドサイクルで十分

http://d.hatena.ne.jp/kensho01/20120208/1328718592
816デフォルトの名無しさん:2012/03/06(火) 15:24:41.40
Haskellでプログラミングするようになってバグがかなり減ったな
他の言語で書くときもバグがかなり減ったような気がする
817デフォルトの名無しさん:2012/03/06(火) 15:45:32.35
変われるよ、俺は変われた
レベルの宣伝
818デフォルトの名無しさん:2012/03/06(火) 19:37:38.98
波形データが入ってる Int とか Double とかのリストを元にモノラルの音を再生する、
たったこれだけのことが最低限できるライブラリは無いでしょうか

やりたいことは、物理モデルを計算して作った音源の再生テストです

Wave ファイルや MIDI ファイル(データ)を読み書きするライブラリはよくありますが、
再生するというのがなかなか見当たりません

唯一自分で見つけたのが OpenAL の Haskell ラッパーです
これは関数や元の OpenAL の仕様などを見ると、どうも目的のことができそうです
ただ、今回の目的にはいささか大げさな感じがします

これしか無ければ OpenAL を勉強してみますが、他に無いでしょうか

使用環境は Windows でも Linux でも構いません
819デフォルトの名無しさん:2012/03/06(火) 19:42:12.26
バイナリファイル(wavとか)に書き出して、
それを外部アプリで再生してはダメなの?
820デフォルトの名無しさん:2012/03/06(火) 19:44:44.51
SDL_mixerのHaskellラッパーがあればいいのだが
821デフォルトの名無しさん:2012/03/06(火) 19:51:50.38
SDL-mixerパッケージがあるがMix_LoadWAV_RW (SDL_RWFromMem(..),..)に相当するものは無いようだな残念
822デフォルトの名無しさん:2012/03/06(火) 20:10:47.47
>>819
すいません、リアルタイムでパラメータ弄って再生させるんで、
ファイル書き出しでは意味が無いんです

まぁ、パラメータ弄り --> ファイル書き出し --> 外部アプリで再生 --> パラメータ弄り・・・
というトライアンドエラーの手間と時間を省く為のリアルタイム再生なんですが
823デフォルトの名無しさん:2012/03/06(火) 21:50:26.37
とりあえずファイルに書き出したのをwxのMediaCtrlで再生すればいいんじゃね。
824デフォルトの名無しさん:2012/03/06(火) 22:04:37.82
>>823

>>822 で言いましたがリアルタイムでやりたいのです

今トライアンドエラーで非常に手間と時間がかかっているので改善したいです
(一回一回のテストにかかる余計な手間と時間はれぞれ微々たるものですが)


どうも OpenAL しか無さそうなのですね
勉強してみます
825デフォルトの名無しさん:2012/03/06(火) 22:18:23.54
unixだと、/dev/dspみたいなデバイスファイルに入出力した場合はこんな感じにもできるが、求めてるのとはちがうかな?
http://www26.atwiki.jp/funa_tk/m/pages/20.html
http://d.hatena.ne.jp/ku-ma-me/touch/20100901/p1
826デフォルトの名無しさん:2012/03/06(火) 22:35:37.57
>>825
なるほど、デバイスファイルに直接データを突っ込むのですね

alsa-pcm ライブラリを使えば、自分で仕組みを作る手間も省けて、
目的は実現できそうな気はします

試してみます
ありがとうございます
827デフォルトの名無しさん:2012/03/07(水) 09:57:49.81
そのへんのデバイスに書き込んで再生する場合、ioctlでフォーマット
(16bit44.1kHzとか)を設定してやる必要があるんだが、

探してみても日本語だとC言語での解説しか見つけられんかった。
ttp://homepage3.nifty.com/rio_i/lab/oss/002sound.htm
828デフォルトの名無しさん:2012/03/07(水) 12:47:42.21
Haskellの質問ではありません


トライアンドエラー
トライアルアンドエラー

どちらが正しいのでしょうか?
829はちみつ餃子 ◆8X2XSCHEME :2012/03/07(水) 13:00:13.48
>>828
トライは動詞でトライアルは名詞だから後者の方が妥当に思える。
Excite の英和にも trial and error の方がのってる。
http://www.excite.co.jp/dictionary/english_japanese/?search=trial&match=&dictionary=NEW_EJJE&block=00045665&offset=0810
830デフォルトの名無しさん:2012/03/07(水) 13:03:29.39
トライが名詞である可能性については考慮されましたか?
831デフォルトの名無しさん:2012/03/07(水) 13:04:12.01
スレ違いに答える必要なし
832デフォルトの名無しさん:2012/03/07(水) 13:15:12.70
ありがとうございました
833はちみつ餃子 ◆8X2XSCHEME :2012/03/07(水) 14:31:35.71
英語って割とグダグダだから文法の細かいことは気にせずググってみて多い方を使ってればいいよ…
834デフォルトの名無しさん:2012/03/08(木) 15:01:04.63
諸君、ライブラリ オブザイヤー2011は何だったかね?
835デフォルトの名無しさん:2012/03/08(木) 15:06:21.26
はじけるハスケル
836デフォルトの名無しさん:2012/03/08(木) 21:47:56.50
ParserCombinator最高や!
readsPrecなんて初めから要らんかったんや!
837デフォルトの名無しさん:2012/03/09(金) 06:13:59.63
我、確率分布ライブラリを所望す

それは指定した分布に従う擬似乱数を吐き出すのである
838デフォルトの名無しさん:2012/03/09(金) 07:16:24.01
欲しけりゃ作れ。
839デフォルトの名無しさん:2012/03/09(金) 12:26:33.75
CalenderTime面倒臭くない?

日時の他にタイムゾーンは良いとして、何で曜日とか、その年の何日目かとか記入せなあかんの?

そんなもん日時から一意に決まるやん
840デフォルトの名無しさん:2012/03/09(金) 12:41:30.91
old-timeなんか使うな
841デフォルトの名無しさん:2012/03/09(金) 12:43:36.01
>>839
一意に決まるのなら、 let t = CalendarTime { ctWDay = ??? の ??? の部分に
曜日を一意に決める関数(と日時などの引数)を記述すれば良いだけだと思うが

そんなもん一度作ってしまえば終わるやん


なぜ記入せなあかんのかは知らない
842デフォルトの名無しさん:2012/03/09(金) 16:20:51.07
>>840
じゃあ何使えばええねん
843デフォルトの名無しさん:2012/03/09(金) 19:07:16.04
>>842
time じゃいかんの?
844デフォルトの名無しさん:2012/03/09(金) 21:54:28.23
Haskellが活躍する領域って例えばどんなところでしょうか。
無限リストを扱う場合…とかではなく、xxをする場合に無限リストを扱うから便利だとか、そんな感じの具体例があると嬉しいです。
845デフォルトの名無しさん:2012/03/09(金) 22:23:50.51
コンピュータが人間に合わせてくれるのではなく、コンピュータに合わせて人間の頭を
作り変えろ、というのがHaskellの思想。
846デフォルトの名無しさん:2012/03/09(金) 22:33:53.73
Schemeスレでやれ
847デフォルトの名無しさん:2012/03/09(金) 22:36:35.18
プログラミング言語がコンピュータに合わせてくれるのではなく、プログラミング言語に合わせてコンピュータのCPUを
作り変えろ、というのがHaskellの思想。
848デフォルトの名無しさん:2012/03/09(金) 22:39:45.50
まずで?wそれもはやプログラミング言語ちゃう
849デフォルトの名無しさん:2012/03/09(金) 23:10:58.86
アセンブラやCはノイマン型コンピューターに寄り添ってるけど、
HaskellやProlog、SQLは数学に寄り添ってる。
850デフォルトの名無しさん:2012/03/09(金) 23:15:33.97
金融とか構文解析とか
851デフォルトの名無しさん:2012/03/09(金) 23:19:57.13
イスラエルの某諜報機関と深い関わりを持つ黒い言語Haskell。
852デフォルトの名無しさん:2012/03/10(土) 01:13:27.63
>>844
積極的な活躍はしないだろう
計算できない事をできないと見抜くとか
しなくていい事をしなくていいと見抜くとかそんな感じ
853デフォルトの名無しさん:2012/03/10(土) 06:27:35.26
>>847
つーか、それってLISPの頃からそうだし、
VM前提の言語(Java含む)もみんなそうだし、
普通のことだと思うけど?
854デフォルトの名無しさん:2012/03/10(土) 07:09:26.98
>>844
Haskellの特徴はこんなところです。

1 関数がファーストオブジェクト → アルゴリズムが単純になる
2 型推論           → 冗長な型指定を省略できる
3 参照透明性         → 状態変化によるバグが減る
4 遅延評価がデフォルト    → アルゴリズムが単純になる
5 文字列はリスト       → アルゴリズムが単純になる

1〜3は特に短所がありません。
しかし4〜5により実行時間に問題がでました。
Haskellの活躍はコーディング時間が実行時間より重要な領域に限られます。
つまり、Haskellが活躍する領域は仕様変更が頻繁な所です。

タイル型WMのXmonadが単純な記述で複雑な事ができるから人気があり、
DVCSのDarcsが遅いから使うだけのユーザに不人気なのが実例です。
855デフォルトの名無しさん:2012/03/10(土) 10:17:59.11
Haskell初心者なんだが、
1 関数がファーストオブジェクト → 値なのか関数なのかコードを見ただけで分からない(そのための型チェックというのは可読性という意味でずれてる気がする)
2 型推論           → 何処の型を省略してエラーになったのかわかりにくい(加減が重要?)
3 参照透明性         → 手続き脳の最大のハードル
4 遅延評価がデフォルト    → 遅延IOがつらい。Iterateeとか初心者には使える気がしない。
5 文字列はリスト       → String BS Textとかどれ選んだらいいのかわからないし文字コードでよくはまる。

どのくらいやればHaskellのメリットが出てくるのか教えて欲しい。
それとも他の言語と違ってプログラミングヘタレはお断り?
856デフォルトの名無しさん:2012/03/10(土) 10:44:16.15
>>854
>1 関数がファーストオブジェクト → アルゴリズムが単純になる
>2 型推論           → 冗長な型指定を省略できる

これらはML系を含むモダンな静的型付け関数型言語に共通な特徴

>3 参照透明性         → 状態変化によるバグが減る

正確には「参照透明性が強制される」と言うべき
結果として3Dレンダリング処理のように破壊的代入のほうが効率的なプログラムでは、
実行時間に問題が出る(もちろん多くのケースではバグが減る利点のほうが大きいけど)

857デフォルトの名無しさん:2012/03/10(土) 11:01:46.76
Haskellだと、あるものが値か関数かって迷い方はしないよね?
引数いくつ欲しいかなってのはよく迷うけど。
858デフォルトの名無しさん:2012/03/10(土) 11:25:43.63
高階関数や遅延評価あたりは、Haskellに限らず通常のプログラミング言語でも
導入がすすんでいくだろうから、知らないでは済まなくなるだろうね。
Haskellみたいにデフォルトですべてが遅延評価とかにはならないだろうが。
859デフォルトの名無しさん:2012/03/10(土) 11:28:29.83
>>856
参照透明性を保ったままでも破壊的操作はできるし、それがHaskellの売り
まだまだ構文的に面倒だって批判はあるだろうけど
860デフォルトの名無しさん:2012/03/10(土) 11:42:42.73
>>855
最初の三つは慣れるしかなさそうだけど、
>遅延IOがつらい。Iterateeとか初心者には使える気がしない。
普通の入力(getChar/getLine)でいいんじゃね
>String BS Textとかどれ選んだらいいのかわからないし文字コードでよくはまる。
バイト列ならByteString
性能が要らないUnicode文字列ならString
性能が要るUnicode文字列ならText
文字コードはWindowsでなけりゃ問題ない気がするけどどういう風にはまるんだろう

わかりやすいHaskellのメリットは、関数プログラミングよりもむしろ、
attoparsecやprettyみたいなコンビネータライブラリが使えることとか、
軽量スレッドとSTMのおかげでマルチスレッドが楽に書けることとかだと思う
861デフォルトの名無しさん:2012/03/10(土) 12:06:13.18
>>860
アドバイスありがとう
ネットで探すと日本語の扱いがみんな違ってて何処見たらいいのかよく分からない。
やりたいことはWindows上でMS932なCSVを読んだり吐いたりしたいんだが、
iconv使うのかとおもったら最近はSystem.IOらしいけどやり方がよく分からない。
862デフォルトの名無しさん:2012/03/10(土) 12:16:53.07
>>861
System.IOはロケールのエンコーディングを使う設計で、
基本的にはその通り動くんだけど、Windows上のマルチバイトだけは対応してない
今はどうするのが主流なのか分からんけどWindowsの人が教えてくれるだろう
863デフォルトの名無しさん:2012/03/10(土) 12:19:36.93
お客様の中でWindowsの人はいませんか〜
864デフォルトの名無しさん:2012/03/10(土) 12:34:45.83
この調子だと低級言語のようにbyte単位で頑張る方がメリットが大きいようだな
865デフォルトの名無しさん:2012/03/10(土) 12:36:31.12
hyde単位に見えた
866デフォルトの名無しさん:2012/03/10(土) 12:53:17.86
頑張ってtext-icuを入れるんだ
867デフォルトの名無しさん:2012/03/10(土) 13:38:04.21
そしたらWindowsではUTF8なら安心?
868デフォルトの名無しさん:2012/03/10(土) 14:03:48.63
>>866
icuin, icudt, icuuc ってこれどっから持ってくればいいの?
869デフォルトの名無しさん:2012/03/10(土) 14:46:24.04
持ってこなくてもパス通しておけばおk
870デフォルトの名無しさん:2012/03/10(土) 15:18:08.53
>>869
もしかして、Visual StudioとかMinGWの開発環境がインストールしてあれば普通にあるものなのか
871デフォルトの名無しさん:2012/03/10(土) 15:31:20.24
ttp://site.icu-project.org/download/
ここから適当なライブラリとヘッダをもってきてパス通したらインストールは通った
動かし方を勉強してみる
872デフォルトの名無しさん:2012/03/10(土) 20:18:52.16
インストールは成功したけど、実際に使おうとするとダメだ・・・
Loading package text-icu-0.6.3.4 ... can't load .so/.DLL for: icuuc (addDLL: could not load DLL)

>>869
どこにパスを通したらいいのか教えてもらえると嬉しいです。
873デフォルトの名無しさん:2012/03/10(土) 20:40:10.19
こういうところがハスケルのパッとしないところなんだよなあ
874デフォルトの名無しさん:2012/03/10(土) 20:48:07.81
使ってる環境にもよるんじゃないの?
ubuntuでは
apt-get install libicu-dev
cabal install text-icu
しただけだよ
875デフォルトの名無しさん:2012/03/10(土) 21:05:16.37
付属ライブラリは初期インストーラに全部入れておいてほしい
といか、むしろ、追加インストールは完全に不可能にしてほしい
876デフォルトの名無しさん:2012/03/10(土) 21:14:31.10
>>872はWindowsでやっとります。
Haskell だけじゃなくて、ruby、clojure、node とかをあえてWindowsで
いろいろ試してるんだけど、Windowsでは動かない追加モジュールってのは
他の言語環境でもけっこうありますな。
877デフォルトの名無しさん:2012/03/10(土) 21:36:42.17
パスを通した上でコンパイルしたものを実行してみそ
確か現行のHaskell Platformについてるghciはうまくshared libraryを使ってくれないとかあった筈
7.4.1は試してないからわからない
878デフォルトの名無しさん:2012/03/10(土) 22:07:07.45
>>876
ghc-7.4.1-i386-windows.exe で普通にインストール
cabal.exeを C:\ghc\ghc-7.4.1\bin に入れる
icu4c-4_4_2-Win32-msvc9.zipを展開し
(このバージョンな理由は仮想環境に入っているが9なのでとう個人的理由)
C:\MyLib\icuとなるようにコピー

cmd.exeから
cabal update
cabal install text-icu --extra-include-dirs=C:/MyLib/icu/include --extra-lib-dirs=C:/MyLib/icu/lib
c:\MyLib\icu\binを環境変数PATHに追加
これで
ttp://hnakamur.blogspot.com/2011/07/ghctext-icu.html
にあるHello的なプログラムはビルド&実行出来たよ
879デフォルトの名無しさん:2012/03/10(土) 22:07:14.33
7.4.1ならいけた
icuuc49.dllみたいな名前だったのでそこからicuuc.dllへシンボリックリンク張るのがいるかも
880デフォルトの名無しさん:2012/03/10(土) 22:36:05.68
ある関数をポリモーフィックにしたいのだが、方法が分からない
ある関数とは以下のような目的のものだ

-1.0 以上 1.0 以下の範囲の Double 型の値があり、
これを Bounded クラスのインスタンス型の値に変換したのだが、
-1.0 を minBound の値に、1.0 を maxBound の値に、
その間を適当に補間した値にしたい

変換先の型が固定されていれば、例えば次のようにできた

quantize :: Double -> Int16
quantize x =
 let b = fromIntegral (minBound :: Int16)
   w = fromIntegral (maxBound :: Int16) - b
 in round $ (x + 1) / 2 * w + b

これを次のような意味に解釈できる形にしたい

quantize :: (Integral a, Bounded a) => Double -> a
quantize x =
 let b = fromIntegral (minBound :: a)
   w = fromIntegral (maxBound :: a) - b
 in round $ (x + 1) / 2 * w + b

言わんとしていることは分かってもらえると思うが、
当然このように記述すればエラーだ

この quantize 関数をポリモーフィックにする方法は何かないだろうか
881デフォルトの名無しさん:2012/03/10(土) 22:42:40.92
{-# LANGUAGE RankNTypes, ScopedTypeVariables #-}
プラグマを追加して
quantize :: forall a. (Integral a, Bounded a) => Double -> a
とシグニチャを変更することでlet内で使ってるaとquantizeの型シグニチャ内でのaを同じものとして指定する
882デフォルトの名無しさん:2012/03/10(土) 23:30:31.55
>>881
助かった
ありがと
883デフォルトの名無しさん:2012/03/10(土) 23:44:13.32
>>880
間は適当に補間したいと言ったが、私が例示したものだと、
変換先が符号付き整数型の場合 0.0 --> -1 と変換されて、
美しくない

私が今作っているシステムの運用上はこれで全く問題ないのだが、
0.0 --> 0 となってくれると気持ちが晴れる

条件分岐を使うくらいならこのままにするのだが、
なにか案があればお聞きしたい
884デフォルトの名無しさん:2012/03/10(土) 23:48:10.20
>>883
すまん、0.0 だけ例外的に 0 に補間されるより、
やはり一様に線形補間の方が美しいな

>>883 は忘れてくれ
885デフォルトの名無しさん:2012/03/11(日) 08:15:52.90
ありがとう。text_icu 動いたよ。
7.0.4のHaskell Platformで、icu4c-4_8_1_1-Win32-msvc10.zipを使った。

icu/bin/icudt48.dll、icu/bin/icuin48.dll、icu/bin/icuuc48.dll を、
ghci-7.0.4.exeと同じ場所へ、icudt48.dll、icuin48.dll、icuuc48.dll と
icudt.dll、icuin.dll、icuuc.dll って名前でコピーしたらロードしてくれた。
886デフォルトの名無しさん:2012/03/11(日) 10:24:22.71
やっぱりtext-icuとByteStringで中身の文字列は明示的に扱うというのが確実なのね。
情報ありがとう
887デフォルトの名無しさん:2012/03/11(日) 12:34:25.23
cabal でパッケージをインストールしようとすると、
時々途中でコンパイルが止まってしまう

[Ctrl + C] で処理を抜けてすぐにもう一度 cabal コマンドを実行すると、
今度は止まらずにインストール作業が進むことが多い

これって何なんだろ

[環境]
Windows7
GHC 7.4.1
cabal-install 0.10.2
cabal 1.10.2.0
888デフォルトの名無しさん:2012/03/11(日) 13:41:15.58
>>887
Haskellのフォルダへの書き込みが管理者権限オンリーになってるとか
889デフォルトの名無しさん:2012/03/11(日) 13:47:40.60
>>888
コマンドプロンプト自体を管理者権限で立ち上げてるから問題ないと思うんだが

ただ、これが問題だったとしても、インストールできたり止まったりというのは何故?
管理者権限オンリーが問題だったら毎回止まるはずじゃない?
890デフォルトの名無しさん:2012/03/11(日) 14:07:27.08
止まってCtrl+Cしたときに失敗してるのに成功したようなテンポラリが作られてるかもしれん
なので、2度目も止まってないだけでインストールできてないかもしれん

止まるときのプロンプトのメッセージを表示すればもっとヒントが降りてくるかもしれん
891デフォルトの名無しさん:2012/03/11(日) 14:21:47.94
パイプを閉じてない等の理由で、子プロセスが終了しないとか。
makeの子プロセスなら、強制終了してもう一回makeすれば次に進む気がする。
892デフォルトの名無しさん:2012/03/11(日) 14:31:27.47
Haskellインストールしなおして、cacls でフォルダ権限を全員全部OKにしてからやるとか
893デフォルトの名無しさん:2012/03/11(日) 14:39:52.11
>>890
ごめん、止まるという言い方が曖昧だったかも
フリーズする(しているように感じる)という意味

> 2度目も止まってないだけでインストールできてないかもしれん
とりあえず、今のところ問題なくライブラリの関数は使えている
ドキュメントもインストールされている

と思うんだが、正しくインストールされているかどうか確認しようがないよね


>>891
フリーズは、configure 段階やドキュメントのインストール段階ではなく、
いくつかの *.hs ファイルをコンパイルしている段階でしか起きない

例えば計20個の *.hs ファイルをコンパイルするとき、
[1/20] ***.hs とか [13/20] ***.hs とかって表示されるよね
この段階で、何個目かの *.hs ファイルのコンパイル時にフリーズする
アレしに行って1時間位して戻ってきてもまだコンパイルが終わらない

で、[Ctrl + C] で抜け出すんだけど、すぐにもう一度 cabal install すると、
今度はすんなりインストールできたりする
あるいは、今度は別の *.hs ファイルのコンパイルでフリーズする事もある
さっきも language-c パッケージで5回くらいでやっとインストールできた
894デフォルトの名無しさん:2012/03/11(日) 14:43:03.07
>>892
この場合、どこのフォルダの ACL を変えればいい?

cabal パッケージがインストールされる先のフォルダ?
895デフォルトの名無しさん:2012/03/11(日) 14:45:27.18
>>894
HaskellPlatform全部と、個人のローカルのライブラリインストール先フォルダ
896デフォルトの名無しさん:2012/03/11(日) 14:51:30.25
>>893
いくつかのライブラリは、スタブからWindowsの環境を読んでhsファイルを生成した後でそのhsファイルをコンパイルしてる
Windowsの環境を設定してなくて、その環境を読む段階で止まってるかも
emacsのシェルモードか何かで作業中のプロンプトのメッセージを全部テキストに保存して、どこかにアップすれば親切な人が何かしてくれるよ

つーか、もともとインストールされてるモノを再インストールしようとしてるというオチじゃ…
897デフォルトの名無しさん:2012/03/11(日) 15:17:52.72
>>895
それやってみて、しばらく様子見てみる


>>896
> Windowsの環境を設定してなくて、その環境を読む段階で止まってるかも

フリーズした後で、そのコンソールを閉じず、すぐに cabal install した時に
問題なくインストールできてしまうのも、それで説明付くということ?

> emacsのシェルモードか何かで・・・
今度何かパッケージをインストールする時には -v3 オプションつけて、
メッセージをリダイレクトするように覚えておくよ
(今のところ、インストールしたいパッケージは特にない)

> つーか、もともとインストールされてるモノを

それはない
たまたま今回は cabal info で未インストールなのを確認済みだし

っていうか、cabal って同じバージョンのパッケージは、
--reinstall オプションを付けないと再インストールできなくないか?

できたとしても、それでフリーズするメカニズムが分からんが
898デフォルトの名無しさん:2012/03/11(日) 18:40:33.74
>>855

> 1 関数がファーストオブジェクト → 値なのか関数なのかコードを見ただけで分からない(そのための型チェックというのは可読性という意味でずれてる気がする)
関数が求める引数の型を知りたいなら、GHCiでtypeコマンドを使えばいい。

> 2 型推論           → 何処の型を省略してエラーになったのかわかりにくい(加減が重要?)
たいていは、それは自分のコードで理解できていないところがあるということだから、コードを見直せばよい。

> 3 参照透明性         → 手続き脳の最大のハードル
IOモナドでO.K.

> 4 遅延評価がデフォルト    → 遅延IOがつらい。Iterateeとか初心者には使える気がしない。
遅延IOはべつに分かりにくいとは思わないが、忘れているとたしかにはまる。
忘れないようにするしかない。

> 5 文字列はリスト       → String BS Textとかどれ選んだらいいのかわからないし文字コードでよくはまる。
分からないなら、Stringで良い。
文字コードの件は、Linuxつかえ。
899デフォルトの名無しさん:2012/03/11(日) 18:43:20.69
>>881
ScopedTypeVariablesはデフォルトにしてほしいよね。
後方互換性ばっさりになるから、そうそうできないだろうけど。
900デフォルトの名無しさん:2012/03/11(日) 18:59:41.81
ScopedTypeVariablesで壊れる互換性ってほとんどないような
forallって名前の型変数を使ってるコードくらい?
901デフォルトの名無しさん:2012/03/11(日) 22:23:23.76
Haskellのコードって長くなると、どんどんインデントが深くなって困るんだけど
有効な対策ってある?
if .. then .. else doの下でインデントを強制的に浅くする方法が、最も多機能なcaseで
使えないのが残念。
902 [―{}@{}@{}-] デフォルトの名無しさん:2012/03/11(日) 22:35:12.33
改行でインデントを減らせるなら積極的に改行する
インデントをスペース二個にする
それでも足りないなら、多分書いてる関数が大きすぎるので分割
903デフォルトの名無しさん:2012/03/11(日) 22:40:15.06
>>898
>1
GHCi使えっていうのは、JavaでEclipse使えば問題ないと言ってるのと同じ気がする
多分、ふつうならここはこう書くみたいな文化というか慣れなんだろう
>2
自分のコードについてはそのとおり
ライブラリとか他人のコードでポイントフリーされてた時が困る
>4
人間が忘れないようにするか、今ならConduit使うということか
>5
結局Windowsは今でも開発向きではないという事なのか
アドバイスありがとう
904デフォルトの名無しさん:2012/03/11(日) 22:56:17.47
値なのか関数なのかコードを見ただけで分からない、っていうけど、
全部関数なんだから値がどうとか考えてたらだめだべ。
"ABC" は String を返す関数。
123 は Int (というか Num a => a) を返す関数。
全部関数。
905デフォルトの名無しさん:2012/03/11(日) 23:07:02.85
>>901
基本的にネストが深くなりすぎるのはどこかアルゴリズムがおかしいんだよ。
書き方じゃなくて、アルゴリズムを見なおしたほうがいいよ。
906デフォルトの名無しさん:2012/03/11(日) 23:07:30.60
どっちかというと全部値と言うべき
907901:2012/03/11(日) 23:11:42.32
>>902,905
関数が長すぎたり、アルゴリズムがおかしいってのは分かるんだけど
条件分岐やパターンマッチングで必ず一段下がるってのはHaskellの特性だと
思うんだよ。
Cならif (hoge) return;で終わるようなパターンが書き辛い
908デフォルトの名無しさん:2012/03/11(日) 23:14:16.21
>>905
アルゴリズムを見ていないのに、おかしいと断言するんですか?
909デフォルトの名無しさん:2012/03/11(日) 23:27:59.79
>>908
するよ。たいていはネストを深くしない書き方できるし。
910デフォルトの名無しさん:2012/03/11(日) 23:41:58.28
>> 907
| ∧∧
|(´・ω・`)
|o   ヾ
|―u' [Maybeモナド when unless] <コトッ
911901:2012/03/11(日) 23:44:57.46
>>910
たとえばCだと
if (hoge) return;
... <- この部分はifと同じインデントの深さ

Haskellのwhenやunlessだと
unless hoge $ do
... <- ここで一段深くなる
912デフォルトの名無しさん:2012/03/12(月) 00:20:43.69
Windowsでの日本語取扱いの面倒くささがHaskellのWindowsへの進出を妨げている
913デフォルトの名無しさん:2012/03/12(月) 00:23:33.07
unless (not hoge) (return ())
例えがよく分からんよw
914901:2012/03/12(月) 00:31:48.93
>>913
つまり、関数の途中で、条件によっては処理をやめる必要がある時、
Cなら続行する部分をインデント無しにできるが、Haskellなら一段必要ってこと。

>>901にも書いた if .. then .. else doで強制的にインデントを無くせるけど、ダサいでしょ?
915デフォルトの名無しさん:2012/03/12(月) 00:34:20.31
寧ろHaskellで書くようになってから
GVimで:vsした画面の幅(大体80文字未満)で賄えるようにコーディングする癖ついた
縦に長くはなるが、実は読む時その方が頭に入ってくる事が判った

横に広がらずにコンパクトに書けた時に脳内麻薬が分泌されるようになった
916デフォルトの名無しさん:2012/03/12(月) 00:38:24.73
コンパクトは適切じゃないな
なにしろ縦には長いのだから

スリム
あるいはナローに書けると嬉しい

ナローライティングを提唱しようか
917デフォルトの名無しさん:2012/03/12(月) 00:50:32.10
>>914
ごめん、ちょっと何言ってんだかかわんない
918デフォルトの名無しさん:2012/03/12(月) 00:51:29.41
>>914
自分もわからん。
実際に長くなる例を書いてみて。

919901:2012/03/12(月) 00:51:54.02
>>914

分かりにくいだろうから、極端な例を作った↓
http://pastebin.com/rM6A18Hf
920デフォルトの名無しさん:2012/03/12(月) 00:55:16.38
>>911
それ、一段深くする必要ないでしょ。
921デフォルトの名無しさん:2012/03/12(月) 01:04:09.04
ソースコードはダサいかクールかじゃない
過去のソースを読んですぐ当時の思考を思い出せるかどうかだ
922デフォルトの名無しさん:2012/03/12(月) 01:21:21.79
>>921
それよく言われるけど、現実問題、「すぐ当時の思考を思い出せる」ところまでやるのは非効率だと思っている。
それよりは常に全体のスタイルやフレームワークを統一するように意識したほうがよい。
923デフォルトの名無しさん:2012/03/12(月) 01:34:27.84
>>922
よく言われるのか

今さっき俺が思い至った事を吟味せず書いただけだけど
924デフォルトの名無しさん:2012/03/12(月) 03:20:48.43
>>919

これってつまり、実はインデントはあんまり関係なくて、
Haskell でショートカットがやりたい、ってこと?

継続モナドとか使えばできなくはないと思うけれど、
たぶんかえって読みにくくなるので、あっちこっちで
条件判断しなくていいように書きかたを変えるのが
一番いいと思う。

925デフォルトの名無しさん:2012/03/12(月) 07:45:47.50
>>897
単純にHDDかマザーボードに不良があるように思えるなぁ
926デフォルトの名無しさん:2012/03/12(月) 10:24:16.94
この手の処理こそMaybeモナドの出番のような
927デフォルトの名無しさん:2012/03/12(月) 10:26:09.62
>>>919
このケースはIOじゃなくてMonadIO m => MaybeT mを使えば良い
具体的にはfun1を次のように書ける。

fun1 :: Bool -> MonadIO m => MaybeT m ()
fun1 b = do
guard $ not b -- (not b)が偽ならば即座にmzeroつまりNothing
liftIO $ putStrLn "hello" -- よってインデントは深くならない
guard $ not .. -- やっぱり深くならない
928デフォルトの名無しさん:2012/03/12(月) 10:27:26.32
半角スペース消し飛ぶの忘れてたわ・・・・

fun1 :: Bool -> MonadIO m => MaybeT m ()
fun1 b = do
  guard $ not b -- (not b)が偽ならば即座にmzeroつまりNothing
  liftIO $ putStrLn "hello" -- よってインデントは深くならない
  guard $ not .. -- やっぱり深くならない
929デフォルトの名無しさん:2012/03/12(月) 10:37:18.81
haskell板でやるべき
930901:2012/03/12(月) 10:40:50.31
>>924
関係ないことはないんだけど、C並にシンプルに中止をしたいってこと。

>>926,927
ご指摘はごもっとも。
でも今度はliftIO地獄になる。特にGUIなプログラムだと。

俺がインデントインデントと言いすぎた所為で、話が噛み合わなくなって
しまった。申し訳無い。
931デフォルトの名無しさん:2012/03/12(月) 10:51:17.06
結局何がしたかったの?
932デフォルトの名無しさん:2012/03/12(月) 11:07:36.66
GUIってことはイベント処理がしたかったのかな・・・

しかしlift地獄にならないためのliftIOなんだが、
liftIO地獄とはまた手厳しい御仁もいたものだ
まあ機能をフラットには合成できないのがモナド変換子の弱点なのは確かだが
933デフォルトの名無しさん:2012/03/12(月) 11:08:12.87
LocalTime何で直接差を取れないんだよ

LocalTime d1 tod1

LocalTime d2 tod2
の差を取るのに一々

(diffDays d1 d2, tod1 |-| tod2) where
  (|-|) = (-) `on` timeOfDayToTime

しないといけないとかどんだけサドだよ

localTimeToDiffTime
があれば
Num DiffTime
なんだから一発なのに
934デフォルトの名無しさん:2012/03/12(月) 13:09:35.97
timezoneが一致しないかもしれない
935デフォルトの名無しさん:2012/03/12(月) 13:29:43.53
ドラクエ2のサマルトリア王子仲間にする時あるいは
役所に何か申請しに行く時並に
モジュールリファレンスたらい回しくらったぜよ

パズルかって
936デフォルトの名無しさん:2012/03/12(月) 13:47:23.56
937デフォルトの名無しさん:2012/03/12(月) 15:06:39.34
お前ら本当にごみだな

何がHaskellだよ
ばかじゃん?気持ち悪い
死ね

お前らさGlenn Seemannって知ってる?
まあお前らよりすげえやつなんだけどお前らはカスだから比べ物にならないけどさ
Hasekellやって黒いターミナル画面に計算結果出して楽しいの?馬鹿?
死ねって
お前ら本当にごみだよな
 ゲームすらろくにつくれねえごみ 
ねえ?わかってんのか?

ゲーム作る人>>>>>>>>>>>>>>>>>お前ら
食べ物作る人>>>>>>>>>>>>>>>>お前ら
938デフォルトの名無しさん:2012/03/12(月) 15:07:35.62
お前ら何も生産性がないよな
なあ?馬鹿?死ね
939デフォルトの名無しさん:2012/03/12(月) 15:08:04.39
目覚めたか?死んどけ
じゃあなカス
940デフォルトの名無しさん:2012/03/12(月) 15:16:01.87
他人のふんどしで相撲を取る。これが俺の生き様
941デフォルトの名無しさん:2012/03/12(月) 15:31:07.39
いつもながら自然言語処理で扱いやすい文体でとてもよろしい
942デフォルトの名無しさん:2012/03/12(月) 17:15:41.64
【3Dゲームエンジン】Unity 10
http://toro.2ch.net/test/read.cgi/gamedev/1331217117

ここの無様なクソゲーしか作れないかわいそうなやつらをなじってください

私が「クソゲーしか作れないのか?!!!」と強烈批判すると

クズ「そのクソゲーすら作れないお前が文句いうな」

とかいってきます

どうしましょう?

私はゲーム開発者ではありません ゲームファンです

やはり彼らは、隠しているのではなく
公に自分のゲームを見せつけています
それを評価しているだけなのに「文句言われます」
それって意味わかりませんよね?

文句言われるなら見せるな作るなって事です

なんとかいってやってください
インテリゲンチャなHaskellハッカーさんたち

やはり
943デフォルトの名無しさん:2012/03/12(月) 18:40:09.87
↑この人、前はもう少し日本語がまともだったような気がするんだが
944デフォルトの名無しさん:2012/03/12(月) 19:41:09.23
俺はここのスレのやつが一番いいと思ってる
こいつらの受け答えはむかつかない

凄いいいやつだらけだなここのスレは

じゃあな
また今度会おうぜ
945デフォルトの名無しさん:2012/03/12(月) 20:07:35.02
ええ、お待ちしております
946デフォルトの名無しさん:2012/03/12(月) 20:36:58.76
data T = V1 Int Int Int
   | V2 Int Double String
   | V3 String Int Int Int Int Int Int

なんていう型を要素として持つリストがあってさ、
そのリストの中から V3 の値構築子で作ったものだけが欲しい場合、

f :: [T] -> [T]
f = filter g

この関数 g は

g (V3 _ _ _ _ _ _ _) = True
g _ = False

とか case of を使って作る事になるが、アンダーバーが鬱陶しい

同じ(qualified な)名前の値構築子で引数の数(や型)が異なるものなんて無いのだから、
V3 にマッチするかどうか調べるのにアンダーバーすら書きたくないのが本音

でも現状、こうやってアンダーバーを書き連ねるしか方法は無いんだよね
947デフォルトの名無しさん:2012/03/12(月) 20:48:58.31
レコード構文を使いなされ…
948デフォルトの名無しさん:2012/03/12(月) 21:06:32.92
>>947
レコード構文ってパターンマッチにも使えるのか

すげー 感動したぜ
ありがと
949デフォルトの名無しさん:2012/03/12(月) 21:54:32.91
data ObjectType = H | F | B

data SomeObject = SomeObject ObjectType String


SomeObject H "Hoge..."
SomeObject F "Foo..."

みたいに使うならそもそも


data SomeObject =
  H String  |
  F String  |
  B String

みたいに宣言した方が良いの?
但し全てStringを使うものとする
950デフォルトの名無しさん:2012/03/12(月) 22:29:44.24
>>949
俺(>>946)に対するレス?

俺はデータ型の合理的な運用という高レベルじゃなく、
単にパターンマッチの記述で楽したいという低レベルの質問をしただけだよ

むちゃくちゃ適当に書いた例が悪かったか?
951デフォルトの名無しさん:2012/03/12(月) 23:12:27.45
>>950
いや全員に訊いた
952デフォルトの名無しさん:2012/03/12(月) 23:45:01.41
>>949
上のタイプの宣言なら
getString (SomeObject _ str) = str
みたいに、ObjectTypeに関わらず文字列を取得するような関数が容易に書ける。
下は全部のパターン網羅しないと無理。

微々たる違いとしては、内部的にはSomeObjectのコンストラクタ情報分サイズ増える。
(ObjectType, String)をnewtypeでラップしてやれば解決だけど。

違いはこんなとこじゃね?
目的に沿ったものを好きに選択しる
953952:2012/03/13(火) 00:02:44.09
わるい、よく考えたらサイズかわんねーな。
微々たる違い〜云々のとこは忘れてくれ…。
954デフォルトの名無しさん:2012/03/13(火) 00:07:48.75
Template Haskell で20行未満の面白いテンプレートを作ったんで見てほしいんだが、
ここに書くと空白文字使えないんで見難くなる
(かといって、全角空白いれるとコピペして即実行はできんし)

どこか、コード片をアップできるところ無い?
955はちみつ餃子 ◆8X2XSCHEME :2012/03/13(火) 00:11:55.85
ブレース記法
956デフォルトの名無しさん:2012/03/13(火) 00:13:09.67
使ったことないけどGistとか
957デフォルトの名無しさん:2012/03/13(火) 00:14:57.80
&amp;で空白を置換するか
upするならhpaste, codepad, pastebinとかいろいろあるよ
958デフォルトの名無しさん:2012/03/13(火) 00:37:30.07
そうか!

(.) の二項演算版がonなんだな!

ならリファレンスに一言そう書きゃいいのに
959デフォルトの名無しさん:2012/03/13(火) 00:37:31.14
ん?

  じゃなくて &で空白を置換すればいいの?
960デフォルトの名無しさん:2012/03/13(火) 00:42:10.98
>>959
ああボケてた。&nbsp;だ
ごめんごめん
961デフォルトの名無しさん:2012/03/13(火) 00:46:04.69
ここにレスすることにしたよ

$(isComeFrom 値構築子) とすると、次のコードが生成される
\x -> case x of 値構築子 -> True; otherwise -> False

値構築子の引数の数も自動的に考慮される

[使用例] filter $(isComeFrom V1) [V2, V1, V3, V1, V6, V1]

{-# LANGUAGE TemplateHaskell #-}
module PatternMatch where
import Language.Haskell.TH

isComeFrom :: Name -> ExpQ
isComeFrom vc = do
  i <- reify vc
  case i of
    DataConI _ t _ _ -> [| \x -> $(caseE [|x|] (alts $ dcArgCnt t)) |]
    otherwise        -> error "The argument of $(isComeFrom) \
                              \template must be a data constructor."
  where alts n =
          [ match (conP vc (replicate n wildP)) (normalB [|True|]) []
          , match wildP (normalB [|False|]) []
          ]

dcArgCnt :: Type -> Int
dcArgCnt (AppT _ t) = 1 + dcArgCnt t
dcArgCnt _          = 0
962961:2012/03/13(火) 00:51:04.94
>>961

実は俺 >>946 なんだが、
パターンマッチ書くのも、otherwise 書くのも面倒になってきたから、
テンプレート作って自動化させた

これ、俺の中では結構需要あって、ただいま絶賛大ヒット中

ただ、テンプレートの関数名がダサいし長いんだが、良い案が思いつかん


ところで、やっぱ個人的にはプロポーショナルなフォントだと見難いな
963961
>>961
すまん、使用例でアポストロフィを書き忘れてた
ついでだから、もう少し詳細な使用例

data T = V1 Int Int Int
       | V2 Int Double String
       | V3 String Int Int Int Int Int Int

t1 = V1 0 0 0
t2 = V2 0 0 "a"
t3 = V3 "a" 0 0 0 0 0 0

filter $(isComeFrom 'V3) [t1, t2, t3, t2, t3, t1]

計算結果

[t3, t3]