08/12/07 12:54:19
ghci の補完って windows じゃ効かないんですかね。
Linux 上だとちゃんと動いて便利だったのでショックです。
ネット探してみると rlwrap 使えとかあったけど
rlwrap って動的な補完(スコープ内の関数一覧等)
って可能なんでしょうか。
913:デフォルトの名無しさん
08/12/07 13:54:21
そんな高度な補完はemacsのinferior-haskellとかeclipseの拡張でもできるかどうか怪しいな
914:デフォルトの名無しさん
08/12/07 13:56:28
英語配列30g早く!
915:902
08/12/07 20:05:48
>>909
書いてありました。これって個人でも送ってくれるのでしょうかね。
ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要
になりそうです。ありがとうございました。
916:デフォルトの名無しさん
08/12/13 18:52:49
do記法と(>>=)の対応についてですが、
do;putStr "a\n";putStr "b\n";putStr "c\n";
≡
putStr "a\n" >>= (\_->putStr "b\n" >>= (\_-> putStr "c\n"))
なんですかね?
右結合的になったり匿名関数に変換されたりと難しいです
917:a36 ◆K0BqlCB3.k
08/12/13 19:06:24
>>916
一緒です。
でも
putStr "a\n">>putStr "b\n">>putStr "c\n"
と書いた方がきれいですよ。
918:a36 ◆K0BqlCB3.k
08/12/13 19:06:57
あと、括弧なくても良いですよ。
919:デフォルトの名無しさん
08/12/14 10:36:09
なるほど、そう言えばlambda式ってかなり優先順位が高いんでしたね
ありがとうございました
920:デフォルトの名無しさん
08/12/14 15:42:38
F#からポロロッカしてきました
fold/undold、flip とかを使った関数合成がすげえ苦手なんですが
このあたりに特化した書籍とかってないでしょうか
モナドとか継続とかはわりとどうでもいいんですが
921:デフォルトの名無しさん
08/12/14 16:19:34
プログラムの変形やそこで使う公式を見るのがいいと思う。
birdがそういうの得意な人だから、
Introduction to Functional Programming using Haskell
URLリンク(www.amazon.com)
"Using Haskell"じゃない前の版の方がその辺は内容が濃かった。
The Algebra of Programming
URLリンク(www.amazon.com)
は関数合成、変形ドリルみたいな内容だった。
たしかparserを必要な機能を持つように変形する論文もあったはず。
922:デフォルトの名無しさん
08/12/14 17:06:40
undoldって何かと思ったけど、unfoldの間違いだよね?
923:920
08/12/14 17:19:51
間違いですw
>>921
ありがとう
Introduction~とRealWorldHaskellをぽちってみました
下は高杉…
924:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/16 12:51:01
要するにfoldってのは累積を計算しているのだから、
その累積演算を関数に独立させると、foldの性質上、継続的になるのです。
mapだとこうはなりません。
927:デフォルトの名無しさん
08/12/16 22:40:24
>>926
ところがどっこい、この説明のすぐ後で、
「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。
それを考えると、foldlの定義からcfold'へ持っていってあげたほうが
親切かもしれません。
928:デフォルトの名無しさん
08/12/16 22:53:36
あっと、「この説明」ってのは
「yet another haskell tutorial の cfold' の説明」のことね。
929:デフォルトの名無しさん
08/12/16 23:38:03
>>927
cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、
mapでは引数に渡す演算ではなくて、:が継続的になるわけです。
だからYAHTでは微妙に表現を変えています。
map f = foldr (\x -> ((f x) :)) []
ですから当たり前ですけども。
930:デフォルトの名無しさん
08/12/19 19:38:36
>>929
すまん、「継続的」という言葉の意味がさっぱり分からん。
CPSにしたときに最後に行われる計算、という意味なら、
foldlは「foldl」自体が継続的、
foldrは引数として渡す関数「f」が継続的ということになるので、
fold*で継続的となる関数が同じになるとは思えない。
931:デフォルトの名無しさん
08/12/21 19:58:16
おそらく激しいFAQだとは思うのですが、日本語の扱いについて。
Charの仕様からして、 >>5の「i. CharをUnicodeとして扱う」が筋と思いますが、
リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。
URLリンク(blog.kfish.org) によると、
メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。
Haskell'でも使えるのがいいですが…。
932:デフォルトの名無しさん
08/12/21 22:14:48
utf8-stringっぽいかな‥‥