zipWith

図らずも,Concurrent Clean : フィボナッチ数列 - lethevert is a programmerval it: α → α = funで取り上げられてて,恐縮と言うか恥ずかしいと言うか.インターネットのオープン性を忘れていました.リファラ見てビックリですよ,はてなのキーワード以外からリンクがあるんだもの.
それは置いといて,折角Haskellerの方々がフィボナッチ数列のそれを書いてくれてるので,じっくり読みますよ.


コードを読んでみると(と言ってもどちらも一行),いやはや,宇宙語じみてます.わかんない.「まだ4日目じゃないか」とかいう言い訳はゴミ箱に捨てて,貪欲に吸収!

let式

式をまとめて何か変数にぶっ込む,と解釈して良いのでしょうか.遅延評価されるとか.

main = let a = putStrLn "abc"
            in a

これで,"abc"って出力してくれるわけですね.なるほど.

zipWith

zipなんて言われても,圧縮のzipしかわかりませんよ.hugsで見てみると

Hugs.Base> zipWith
ERROR - Cannot find "show" function for:
*** Expression : zipWith
*** Of type    : (a -> b -> c) -> [a] -> [b] -> [c]

新しい.(a->b->c)ってどーゆー意味だ?

Hugs.Base> zipWith (+)
ERROR - Cannot find "show" function for:
*** Expression : zipWith (+)
*** Of type    : [Integer] -> [Integer] -> [Integer]

Hugs.Base> zipWith (++)
ERROR - Cannot find "show" function for:
*** Expression : zipWith (++)
*** Of type    : [[a]] -> [[a]] -> [[a]]

ほぅ.

Hugs.Base> zipWith (++) ["abc"] ["def"]
["abcdef"]

Hugs.Base> zipWith (+) [1,2,3] [2,3,4]
[3,5,7]

ほほぅ,なんか凄い便利そうだぞコレ.確かに,Haskellerなら迷わずzipWithを使いそうだ.
実際にリンク先のフィボナッチ数列生成関数(?)を走らせてみると,もの凄い勢いで無限にフィボナッチ数列が生成されて,焦る.これがHaskellか.やっぱ本買わないと分かんないかなぁ.