- 1 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:41:29 ]
- haskell.org
www.haskell.org/ 日本語サイト www.sampou.org/cgi-bin/haskell.cgi www.shido.info/hs/ 過去ログ 関数型プログラミング言語Haskell Part1 pc.2ch.net/tech/kako/996/996131288.html Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/ Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/ Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/ Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/ Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/ Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/ Part8 pc11.2ch.net/test/read.cgi/tech/1193743693/ ・2chの仕様により、行頭の半角スペースは表示されません。 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
- 920 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 15:42:38 ]
- F#からポロロッカしてきました
fold/undold、flip とかを使った関数合成がすげえ苦手なんですが このあたりに特化した書籍とかってないでしょうか モナドとか継続とかはわりとどうでもいいんですが
- 921 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 16:19:34 ]
- プログラムの変形やそこで使う公式を見るのがいいと思う。
birdがそういうの得意な人だから、 Introduction to Functional Programming using Haskell www.amazon.com/Introduction-Functional-Programming-using-Haskell/dp/0134843460/ "Using Haskell"じゃない前の版の方がその辺は内容が濃かった。 The Algebra of Programming www.amazon.com/Algebra-Programming-Prentice-Hall-International-Computer/dp/013507245X/ は関数合成、変形ドリルみたいな内容だった。 たしかparserを必要な機能を持つように変形する論文もあったはず。
- 922 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 17:06:40 ]
- undoldって何かと思ったけど、unfoldの間違いだよね?
- 923 名前:920 mailto:sage [2008/12/14(日) 17:19:51 ]
- 間違いですw
>>921 ありがとう Introduction〜とRealWorldHaskellをぽちってみました 下は高杉…
- 924 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 17:13:13 ]
- yet another haskell tutorialの4.6で
cfold' f z [] = z cfold' f z (x:xs) = f x z (\y -> cfold' f y xs) という継続fの与え方次第でfoldlにもfoldrにもなるものが出てきたんですが 普通のfoldlやfoldrの定義からこれを導きだす手順のようなものがあるなら知りたいです また「なんでも再帰」流に一つ引数増やして、最後にそれを必ず呼び出すようにして 末尾再帰の形に直していく…ってやり方で書こうとしてますがさっぱりです
- 925 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:48:15 ]
- 面倒だからfactorialで書くと、
fac 0 = 1 fac n = n * fac (n-1) なのか fac n = fac (n-1) * n なのかってことだから、 fac n = ((n *) . fac) (n-1)あるいは、 fac n = ((* n) . fac) (n-1) fac n = (((\m ->(m *)) n) . fac) (n-1)あるいは、 fac n = (((\m ->(* m)) n) . fac) (n-1) fac0 f n = ((f n) . (fac0 f)) (n-1)で fac0 (\m ->(m *)) nあるいはfac0 (\m ->(* m)) n \m ->(m *)と\m ->(* m)は、 fac(n-1)を計算した後にすべき計算、つまり継続になっています。
- 926 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:51:01 ]
- 要するにfoldってのは累積を計算しているのだから、
その累積演算を関数に独立させると、foldの性質上、継続的になるのです。 mapだとこうはなりません。
- 927 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:40:24 ]
- >>926
ところがどっこい、この説明のすぐ後で、 「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。 それを考えると、foldlの定義からcfold'へ持っていってあげたほうが 親切かもしれません。
- 928 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:53:36 ]
- あっと、「この説明」ってのは
「yet another haskell tutorial の cfold' の説明」のことね。
- 929 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 23:38:03 ]
- >>927
cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、 mapでは引数に渡す演算ではなくて、:が継続的になるわけです。 だからYAHTでは微妙に表現を変えています。 map f = foldr (\x -> ((f x) :)) [] ですから当たり前ですけども。
- 930 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 19:38:36 ]
- >>929
すまん、「継続的」という言葉の意味がさっぱり分からん。 CPSにしたときに最後に行われる計算、という意味なら、 foldlは「foldl」自体が継続的、 foldrは引数として渡す関数「f」が継続的ということになるので、 fold*で継続的となる関数が同じになるとは思えない。
- 931 名前:デフォルトの名無しさん [2008/12/21(日) 19:58:16 ]
- おそらく激しいFAQだとは思うのですが、日本語の扱いについて。
Charの仕様からして、 >>5の「i. CharをUnicodeとして扱う」が筋と思いますが、 リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。 blog.kfish.org/2007/10/survey-haskell-unicode-support.html によると、 メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。 Haskell'でも使えるのがいいですが…。
- 932 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 22:14:48 ]
- utf8-stringっぽいかな‥‥
|

|