やっとPrelude
それでは,今日からPreludeの関数を少しずつ見ていきます.
break
リストを与えられた条件の位置を境界にして分け,2つのリストのタプルを作成.
Hugs.Base> break ('o'<) "hello,world" ("hello,","world")
へぇ〜.
ceiling
引数より大きい整数の中で最小のものを返すのかな.
Hugs.Base> ceiling 12.3 13 Hugs.Base> ceiling (-12.3) -12
何かに使えるだろうよ.
concat
リストのリストを受け取り連結.中身はこうなってるのかぁ.
concat :: [[a]] -> [a] concat xs = foldr (++) [] xs
良く出来てるなぁ.まだfoldrとfoldlが良くわかっていないので,実験.
Hugs.Base> :t foldl foldl :: (a -> b -> a) -> a -> [b] -> a Hugs.Base> foldl (++) [[1,2,3]] [] [[1,2,3]] Hugs.Base> :t foldr foldr :: (a -> b -> b) -> b -> [a] -> b Hugs.Base> foldr (++) [] [[1,2,3]] [1,2,3]
へー.foldrは右を弄って左に合わせて,foldlは左を弄って右に合わせるのか.
concatMap
今日のナンダコレ大賞.例を見ても,チンプンカンプンだぜっ.
creates a list from a list generating function by application of this function on all elements in a list passed as the second argument
リストを生成する関数を,リストの全ての要素に適用して新しいリストを作る,とでも解釈して良いのかしら.・・・リストを生成する関数って・・・何だ?例にあるように,lambdaを使うのが何とも楽そうだ.
Hugs.Base> concatMap (\n -> (n-1):n:(n+1):[]) [1,2,3] [0,1,2,1,2,3,2,3,4]
小難しい関数だなぁ.
curry
カリー化のカリーかしら.てかカリー化って何.
カリー化(currying) は関数の引数を常に一つだけ取るように変換することです。
例 f (x, y) => (f' (x)) (y)
というように、 f(x , y) というように二引数をとる関数を、f'(x) という、関数を返す関数にして、それに y を適用することで f (x, y) と同様の結果を得ます。
http://genjo9.lit.let.hokudai.ac.jp/keita/read.cgi?%A5%AB%A5%EA%A1%BC%B2%BDより
そして,curryはと言うと,
curry converts an uncurried function to a curried function
カリー化されていない関数をカリー化するのか.「ふーん」.
こういう事か.
hoge (x,y) = x + y hoge' = curry (\ (x,y) -> x + y) huga (xs,ys) = zipWith (+) xs ys huga' = curry (\ (xs,ys) -> zipWith (+) xs ys) Main> hoge (1,2) 3 Main> hoge' 1 2 3 Main> huga ([1,2,3],[4,5,6]) [5,7,9] Main> huga' [1,2,3] [4,5,6] [5,7,9]
breakとcurryを組み合わせたら面白いかも.
それじゃぁ今日はコレぐらいで.