関数型プログラミング言語Haskell Part11
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2009/09/08(火) 13:03:13http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 http://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 http://pc12.2ch.net/test/read.cgi/tech/1231861873/
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0809デフォルトの名無しさん
2010/04/10(土) 21:21:40ttp://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E
0810デフォルトの名無しさん
2010/04/10(土) 21:23:38日常的なことは他の言語を使ってればいい。
0811デフォルトの名無しさん
2010/04/10(土) 21:24:36Haskellはそもそもその始まりが純粋関数型のフラッグシップ。
それまで乱立していた関数型言語の人をみんなHaskellに結集させたんだから当然。
0812デフォルトの名無しさん
2010/04/10(土) 21:31:48Haskellやってるのは数学系の人じゃないんだけどね。
コンピュータサイエンスの人。
0813デフォルトの名無しさん
2010/04/10(土) 21:32:59いや、ここに挙がってる他のは古いか細ってるかみたいだったから、
ほかに新しいのいないのかなと思って。
0814デフォルトの名無しさん
2010/04/10(土) 21:44:06新しいのを作るのが意味ないからね。少なくとも研究目的では。
純粋かつ非正格評価という制約がある限り、先行するHaskellの劣化コピーにしかならない。
みんなHaskellに移ってしまったから、MirandaもCleanもリソースがない。
だからますますHaskellに集まる。
このポジティブフィードバック。
0815デフォルトの名無しさん
2010/04/10(土) 21:50:31たしか、それぞれ独自に研究してた人たちが究極のを作ろうと集結したんだっけ。
この頃の話とか、Haskell に魅了された研究者たちの話って書籍化されてないのかな。
インタビューとか交えたノンフィクションがあれば是非読んでみたい。
0816デフォルトの名無しさん
2010/04/10(土) 21:58:360817デフォルトの名無しさん
2010/04/10(土) 21:59:20Clean
0818デフォルトの名無しさん
2010/04/10(土) 22:00:54正格には、MirandaやCleanから人が移って減ったわけではない。
他の純粋な人たちがみんなでHaskellを作っただけ。
0819デフォルトの名無しさん
2010/04/10(土) 22:02:21レスどうもです。そうでしたか。
今はどうやって関数型の利用を進めるかを考える時期なんでしょうかね
0820デフォルトの名無しさん
2010/04/10(土) 22:10:03計算機理論の体系をフレームに他分野の理論を読み替えて、
具体的解を取得できる形式系を作ればいい。
0821デフォルトの名無しさん
2010/04/10(土) 22:20:54Haskellの型システムに対する拡張の研究はこれからも続くだろう。
ttp://cacm.acm.org/magazines/2010/2/69367-type-theory-comes-of-age/fulltext
0822デフォルトの名無しさん
2010/04/10(土) 22:24:22主観と客観がないまぜになった実学を洗練することができそうだな
0823デフォルトの名無しさん
2010/04/10(土) 22:25:28おめーかよw
おれは>>797だけど、厳密に言うとdoが抜けてるな
ちなみにScalaやClozureはJavaのランタイムに明るくないと
あんまり恩恵受けないってことはないの?
0824デフォルトの名無しさん
2010/04/10(土) 22:42:43確かにプログラミング言語を仕事で使うにはランタイムの知識も必要だといわれている。
しかしGHCも遅延評価のおかげでとても不可解だ。サーバでは使えないだろう。
ところでScalaもClojureも末尾最適化をしないらしい。
再帰ではなくイテレーティブに書かなければいけない。
関数型言語と称するには無理があるんじゃないか。
0825デフォルトの名無しさん
2010/04/10(土) 22:51:420826デフォルトの名無しさん
2010/04/10(土) 22:54:220827デフォルトの名無しさん
2010/04/10(土) 22:54:220828デフォルトの名無しさん
2010/04/10(土) 23:18:03すべての関数をIO型にするしかない?
0829デフォルトの名無しさん
2010/04/10(土) 23:18:250830デフォルトの名無しさん
2010/04/10(土) 23:25:36なぜ Writer を使わない?
そういう意味ではないの?
0831デフォルトの名無しさん
2010/04/11(日) 00:32:55書き方が悪かった。
論点は,「ロギングを素直に挿入すると、関数の型を変えざるを得ないが、もっと良いやり方はないか?」
ということです。
0832デフォルトの名無しさん
2010/04/11(日) 01:58:38unsafeio
0833デフォルトの名無しさん
2010/04/11(日) 02:12:34デバッグのときとかに、関数の評価の様子を知りたいだけなら、traceを入れてghciで実行。
アプリケーションの機能としてログ出力を行いたいのなら、純粋な関数は引数が変わらないかぎりなんど実行しても動作が同じでそのログをとる必要はなく、
実行ごとに引数が変わるのは外部と関係するときだけだから、かならずIOモナドでログをとれるタイミングがあると思うんだけど?
モナド上で行わない限り、出力するタイミングを制御できないわけだし(評価順序をあれこれ考えればできなくもないけど)。
0834デフォルトの名無しさん
2010/04/11(日) 06:18:00最初期の人ではないが、RWHを書いたサリバンへのインタビューがネットで読める。
http://broadcast.oreilly.com/2009/01/the-power-of-haskell.html
0835デフォルトの名無しさん
2010/04/11(日) 06:33:12速い場合もあるし遅い場合もある。
値がサンクとして渡されるので、全体として時間コストも空間コストも予測が難しい。
GHCが遅いのは最適化よりも新規性目的で機能が取り込まれているせいもある。
0836デフォルトの名無しさん
2010/04/11(日) 07:10:570837デフォルトの名無しさん
2010/04/11(日) 12:54:54ありがと
ついでに、自分でも調べたら
「A History of Haskell: Being Lazy With Class」なる論文を見つけた。
http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/
面白そうなんで併せて読んでみる。
0838デフォルトの名無しさん
2010/04/11(日) 15:49:53なんだよこれ3パッケージに1つはエラーでビルド失敗するわ
0839デフォルトの名無しさん
2010/04/11(日) 15:55:100840デフォルトの名無しさん
2010/04/11(日) 16:18:280841デフォルトの名無しさん
2010/04/11(日) 16:19:250842デフォルトの名無しさん
2010/04/11(日) 16:31:22おまえら、なんでこんな時間に書き込みできるわけ?
普通の人なら学校や会社があるはずなんだけど
このことを知った親は悲しむぞ?
もっと、現実を見ようぜ。
0843デフォルトの名無しさん
2010/04/11(日) 16:52:190844デフォルトの名無しさん
2010/04/11(日) 17:11:07普通の人ならそんな質問をしないはずなんだけど。
もっと現実を見ようぜ。
0845デフォルトの名無しさん
2010/04/11(日) 17:17:250846デフォルトの名無しさん
2010/04/11(日) 17:20:320847デフォルトの名無しさん
2010/04/11(日) 17:23:55個別にインストールすれば成功するのに
なぜだろう
0848デフォルトの名無しさん
2010/04/11(日) 18:30:130849デフォルトの名無しさん
2010/04/11(日) 18:38:54死ねCabal
0850デフォルトの名無しさん
2010/04/11(日) 18:41:27では Cabal はもう死んだと思って、別の手段を使えばいいのではないか
0851デフォルトの名無しさん
2010/04/11(日) 19:10:390852デフォルトの名無しさん
2010/04/11(日) 19:12:51研究のためのモルモットに過ぎなかったから
0853Mail: sage
2010/04/12(月) 03:23:58エピかつモニックだがアイソではない射がhaskellにあるか否か、とか。
答えは知らんが、圏論とhaskell以外の知識はいらない問題。
あと、圏論だけだけど、モナド<T,η,μ>からKleisli Triple<T,η,*>を導き、
Kleisli Tripleが満たす法則を証明し、
逆にモナド則をKleisli Tripleから導くとか。
0854デフォルトの名無しさん
2010/04/13(火) 12:31:36lispはすでに習得しているレベルの人向けな本はないですか
0855デフォルトの名無しさん
2010/04/13(火) 12:38:15・Haskell: The Craft of Functional Programming
・Algorithms A Functional Programming Approach
・The Haskell School of Expression
辺り
普通のハスケルは読んだこと無いから「くどさ」がよく分からんが、
もしかしたら一番上のもちょっとくどいかも知れん。
もう少し分かるなら、
・the fun of programming
も良い
0856デフォルトの名無しさん
2010/04/13(火) 13:04:34RWHはダメなの?
分かるところは飛ばせばいいんだし
0857デフォルトの名無しさん
2010/04/13(火) 18:12:15http://www.ipsj.or.jp/07editj/promenade/4703.pdf
0858デフォルトの名無しさん
2010/04/13(火) 19:14:11余計なおしゃべりのないそれが一番いいと思うんだけどな
イメージが湧かないというのなら
http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html
0859デフォルトの名無しさん
2010/04/14(水) 06:37:270860デフォルトの名無しさん
2010/04/14(水) 10:15:50図式が可換、っていうのは
「その図中で、ある地点からある地点への経路をどのように取っても
(どういう射の合成を使っても)等しい」という意味なので、
例えば自然変換η:Ix->Tの自然性を示す可換図式は
ηA
IxA ---> TA
f| |Tf
V ηB V
IxB ---> TB
こいつは、以下の式と同じ意味
Ixf○ηB= ηA○Tf (fはA->Bの全ての射,Ixは恒等函手,Tは函手)
ドメイン、コドメインなんて図で考えてれば間違えることは無いので、
積極的に図式を使うといい。
0861デフォルトの名無しさん
2010/04/14(水) 18:08:18心当りがある方がいらっしゃれば教えてください
0862デフォルトの名無しさん
2010/04/14(水) 18:33:48> and an IO-Interface:Approaching a Theory of unsafePerformIO
辺り?
0863デフォルトの名無しさん
2010/04/14(水) 18:35:43> FUNDIO: A Lambda-Calculus With letrec, case, Constructors,
> and an IO-Interface:Approaching a Theory of unsafePerformIO
辺り?
0864デフォルトの名無しさん
2010/04/14(水) 18:36:44> FUNDIO: A Lambda-Calculus With letrec, case, Constructors,
> and an IO-Interface:Approaching a Theory of unsafePerformIO
じゃねえかな。
0865デフォルトの名無しさん
2010/04/14(水) 18:41:270866デフォルトの名無しさん
2010/04/14(水) 18:42:000867デフォルトの名無しさん
2010/04/14(水) 20:42:00左畳み込みでメモリリークが発生しやすくて、右畳み込みだと発生しにくい理由が分からんです
だれか教えてください
0868デフォルトの名無しさん
2010/04/14(水) 22:36:37foldr : (f a1 (f a2 (f a3 i)))
foldl : (f (f (f i a1) a2) a3)
分かりやすくするために、本来はひとつの同じ関数 f に評価順番号を添えて区別してみる。
foldr : (f1 a1 (f2 a2 (f3 a3 i)))
foldl : (f1 (f2 (f3 i a1) a2) a3)
foldr はまず関数 f1 を a1 に適用し、a1 を評価し、
その結果としてカリー化された関数(仮に fa1 とする)を返す。
この時点で、a1 は既に評価されてしまったので、a1 の情報はその評価結果の値のみが残り、
a1 を評価するために必要だったその他の情報はもう不要なので捨てられる。
つまり、メモリから破棄される。
(fa1 (f2 a2 (f3 a3 i)))
次に関数 fa1 を (f2 a2 (f3 a3 i)) に適用し、(f2 a2 (f3 a3 i)) を評価する。
そして関数 f2 を a2 に適用し、a2 を評価し、カリー化された関数 fa2 を返す。
(fa1 (fa2 (f3 a3 i)))
以下繰り返し。
foldl の方は次スレ >>869
0869デフォルトの名無しさん
2010/04/14(水) 22:38:18foldr : (f1 a1 (f2 a2 (f3 a3 i)))
foldl : (f1 (f2 (f3 i a1) a2) a3)
一方 foldl は関数 f1 を第1引数である (f2 (f3 i a1) a2) に適用しようとする。
このとき、第1引数を評価した結果のカリー化された関数がまだ完成していないから、
第2引数である a3 もまだ評価されずにメモリに残ることになる。
では、いつまで残るかというと、評価をシミュレートしてみれば分かるが、
括弧の最も奥の (f3 i a1) が評価され、(f2 その結果 a2) が評価され、
(f1 その結果) が評価された後のカリー化された関数がやっと a3 に適用されるまで残る。
入れ子の次のレベルの深さにある a2 はその一段階前までメモリに残る。
つまり、foldl はリストの後ろの方の要素ほどメモリに長く居続ける。
これがあなたの言うメモリリークというものの正体。
ちなみに、Haskell ではこういう一見分かりにくいメモリ領域の使用を
メモリリークではなくスペースリークと呼ぶ。
私はこう解釈しているが、もし違ってたらごめん。
0870デフォルトの名無しさん
2010/04/14(水) 22:55:24間違ってる
>その結果としてカリー化された関数(仮に fa1 とする)を返す。
>この時点で、a1 は既に評価されてしまったので、a1 の情報はその評価結果の値のみが残り、
fの定義のされ方にもよるけど、普通に二引数関数として定義されているなら(f a1)を評価してもa1は評価されない
仮に評価されたとしても、評価済みの値を持っておく必要があるので結局メモリが要る
>>867
foldrがfoldlに比べて空間効率がいいのは、畳み込みに使う関数が第二引数について非正格なとき(他にもある?)
例えば(++)は第二引数についてほぼ非正格なので、
concat = foldr (++) []
と定義すればO(1)の空間で動く(紙の上で追ってみれば分かると思う)のに対して
concat = foldl (++) []
だと酷いことになる
0871デフォルトの名無しさん
2010/04/14(水) 23:16:49>fの定義のされ方にもよるけど、普通に二引数関数として定義されているなら(f a1)を評価してもa1は評価されない
あ、そうか。
ベータ簡約はされるが(実装的にはポインタの差し替え程度だと思うが)、
評価までは未だされないのか。
やっぱり間違ってたか。
>>867 すまん、無視してくれ。
0872デフォルトの名無しさん
2010/04/15(木) 00:26:45foldr op init [x1:x2:x3]
=> x1 `op` (foldr op init [x2:x3])
=> x1 `op` (x2 `op` (foldr op init [x3]))
=> x1 `op` (x2 `op` (x3 `op` (foldr op init [])))
=> x1 `op` (x2 `op` (x3 `op` init))
foldl op init [x1:x2:x3]
=> foldl op (init `op` x1) [x2:x3]
=> foldl op ((init `op` x1) `op` x2) [x3]
=> foldl op (((init `op` x1) `op` x2) `op` x3) []
=> ((((init `op` x1) `op` x2) `op` x3)
一部だけしか必要ない場合(headとかtake 2とか)は空間効率も違ってくる。
>>870の言う通り、opの第二引数が非正格なとき(第二引数を評価しなくても値が返せる場合のことでしょ?)で
なおかつ第二引数が必要なかった場合はfoldrは左端のx1を返すだけで後の計算はしないしメモリにも残さない。
foldlの場合は第一要素を求める場合、最終行まで展開したあと、
ここから更に全部を計算していく必要があってメモリは要るわ最終的にいらないところまで計算するわで効率が悪い。
0873デフォルトの名無しさん
2010/04/15(木) 00:28:40t05l.hs: act n = foldl (+) 0 [1..n]
t05r.hs: act n = foldr (+) 0 [1..n]
t05l.hs, t05r.hs:
main = do
n' <- getArgs
let n = read (n' !!0)
putStrLn (show (act n))
>ghc -O2 --make {t05r.hs | t05l.hs} -prof -auto-all -caf-all -fforce-recomp
>t05l 5000000
12500002500000
>t05r +RTS -K100M -RTS 5000000
Stack space overflow: current size 100000000 bytes.
Use `+RTS -Ksize -RTS' to increase it.
>t05r +RTS -K800M -RTS 5000000
12500002500000
が得られた。
何かで、foldl のヒープの使用が、 foldr ではスタックの使用に変わったようなもの。。。
というようなことを聞いた不確かな記憶があるのですが、
サンクとはどのような情報をどのような形で保持しているのでしょうか?
0874デフォルトの名無しさん
2010/04/15(木) 00:51:18thunkってのは>>872にあるような、計算途中の式のこと。
x1 `op` (x2 `op` (x3 `op` init))みたいなの。
メモリ上にどう構成されているかは知らんが、遅延評価だとサンクが大きくなりがち。
0875870
2010/04/15(木) 08:59:34>>872
全部を評価する場合でも、結果を順番に読み捨てていくなら空間効率も変わるよ
たとえば、
print $ foldr (++) [] $ map (flip replicate ()) [0..n]
は全体としてO(1)の空間で動くけど、foldrをfoldlにするとO(n)になる
0876デフォルトの名無しさん
2010/04/15(木) 18:21:090877デフォルトの名無しさん
2010/04/15(木) 18:28:44foldl (+) 0 [1..10000000]とfoldr (+) 0 [1..10000000]をPreludeで走らせてタスクマネージャ見たけど、
大きな違いないね。
>>867
分かりません
0878デフォルトの名無しさん
2010/04/15(木) 19:46:53http://atnd.org/events/3820
0879デフォルトの名無しさん
2010/04/15(木) 21:49:35名古屋で似たようなミーティングはないですか?
東京まで行く時間がありません
0880デフォルトの名無しさん
2010/04/15(木) 22:03:42ビデオを撮ってストリーミングか、後で公開してくれるのなら
金払ってでも見るんだがなぁ
0881デフォルトの名無しさん
2010/04/15(木) 22:35:18その前に達人の書いたHaskellのコードを読んでみたい。
ってオレにおすすめのサイト教えて。よろ
0882デフォルトの名無しさん
2010/04/15(木) 22:41:52達人たちはこう考えるのか、という本だと思う
0883881
2010/04/15(木) 22:48:20http://www.amazon.co.jp/Programming-Cornerstones-Computing-Jeremy-Gibbons/dp/0333992857/ref=sr_1_1?ie=UTF8&s=english-books&qid=1271339095&sr=1-1
これ?
ってか、書籍代節約するために読書用のモニタ増やしたので、出来ればサイトで・・・
英語読めます
0884デフォルトの名無しさん
2010/04/15(木) 22:49:380885デフォルトの名無しさん
2010/04/15(木) 23:40:51名古屋であるとしたら OCaml Meeting かなあ
0886デフォルトの名無しさん
2010/04/16(金) 10:05:400887デフォルトの名無しさん
2010/04/16(金) 21:31:150888デフォルトの名無しさん
2010/04/17(土) 12:50:070889デフォルトの名無しさん
2010/04/17(土) 15:23:470890デフォルトの名無しさん
2010/04/17(土) 18:59:19分かった様な気がしたり、また分からなくなったりを繰り替えしております(笑)
0891デフォルトの名無しさん
2010/04/17(土) 19:24:26いやそれ以前にdiagram, universal construction, limitあたりもあやしい
0892デフォルトの名無しさん
2010/04/17(土) 20:21:30haskell的には、例えば「Int->String型のすべての単相関数」あるいは「型が同じ単相関数をすべて同一視して考えると…」っていうように考えればよいの?
0893デフォルトの名無しさん
2010/04/18(日) 01:25:20commutative diagramが分かればnatural transformが分かる。後は知らない。
>>892
単相関数なる単語は初めて聞くけど、同じ型の射を集めたものをhom集合と呼んでいるだけでしょ?
Haskellの型を圏の対象とし、Haskellの関数を射としてみればhom(Int,String)は
Int->Stringの関数全てをさす。
0894デフォルトの名無しさん
2010/04/18(日) 11:04:05報告っつっても、アジェンダの通りだったけど。
Simonさんの話はビューティフルコードの通り。STM は IORef みたいなことが
できるけど、アトミックな実行が保証されるからレースが起きないよとか、
ミサイル発射(という例が好きなんだなw)みたいな IO は型のおかげで
STM の中には入れられないよ、とか。
話のマクラに、Haskellって普及したよね、委員会による設計の言語
(一般には失敗するとされている)だけど、とかそんな話題もあった。
http://langpop.com/ のグラフをいくつか挙げたり。(LtUのグラフとか)
山本さんの話はmew.orgに使ってるHaskell製httpdについて。
性能の話が主だった。C10Kにも耐えるようにprefork使ったとかselect遅いとか。
山下さんの話は「擬データ」の紹介で、Pseudoというデータコンストラクタ(かな?)とか
:-> という演算子(Haskellの文法的にはコンストラクタだけど、多分コンストラクタじゃ
ないと思う)で、擬データから値を取り出す...のかな。ちょっと理解しきれなかった。
当日のプレゼン資料どっかで公開しないのかな?
0895デフォルトの名無しさん
2010/04/18(日) 19:37:52積極的に使おうと思います
0896デフォルトの名無しさん
2010/04/18(日) 20:40:46STMモナドの中に(小細工しなければ)普通のIOを入れられない、ってそんなに有益かなぁ。
STMモナドを入れ子にしてしまう危険を避けられるという点は有益だと思うけど。
0897デフォルトの名無しさん
2010/04/18(日) 21:03:560899デフォルトの名無しさん
2010/04/18(日) 22:08:42http://www.cambridge.org/uk/catalogue/catalogue.asp?isbn=9780521513388
0900デフォルトの名無しさん
2010/04/18(日) 22:45:390901デフォルトの名無しさん
2010/04/18(日) 23:36:01気の早いこって
0902デフォルトの名無しさん
2010/04/19(月) 00:13:390903デフォルトの名無しさん
2010/04/19(月) 03:54:430904デフォルトの名無しさん
2010/04/19(月) 04:44:510905デフォルトの名無しさん
2010/04/19(月) 17:31:26OpenGLのウィンドウを閉じたときに処理が終わるようにってできないの?
Haskell 6.4.2 だと勝手に閉じるんだけど、
Haskell 6.10.4 だとならない。
**
windows 7
Haskell 6.10.4
HOpenGL 2.4.0.1
0906デフォルトの名無しさん
2010/04/19(月) 18:35:140907デフォルトの名無しさん
2010/04/19(月) 21:09:49ttp://mono.kmc.gr.jp/~oxy/w/?Lazy+Evaluation
中身がお互いに参照されてループになってて、GCでお掃除されず永久にメモリに居ることになったりするん?
0908デフォルトの名無しさん
2010/04/19(月) 21:41:32循環参照で困るのはリファレンスカウント GC くらいじゃね?
それもアルゴリズムを工夫することで解消できるし
レス数が900を超えています。1000を超えると表示できなくなるよ。