やっと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を組み合わせたら面白いかも.
それじゃぁ今日はコレぐらいで.