zipWith
図らずも,Concurrent Clean : フィボナッチ数列 - lethevert is a programmerやval 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か.やっぱ本買わないと分かんないかなぁ.