今日は、
- function composition
- where clause
- cons
について。
function compositionは、その名のとおり合成関数です。f, g, hという関数がある場合、
f (g(h(x)))
は、Haskellでは、
f $ g $ h x
と書けます。また、function compositionを使用すれば、
(f . g . h ) x
と書けます。使いどころとしては、mapの第一引数に合成関数を使用したい場合でしょう。
次にwhere 節について。where節は、関数の中で有効なローカル変数、関数を定義します。
以上をふまえて、まず、sin (x^2)を計算するプログラムを書きます。
main = print $ map (sin . sq) [1..10]まあ、そのままですね。。
where sq x = x * x
最後に、consについて。consは":"(コロン)のことです。パターンマッチの説明のときに出てきました。
a : x
とすると、要素aをリストxの先頭に追加することができます。
例えば、リスト[1,2,3,4,5]は、
1:2:3:4:5:[]
と書けるわけです。(最後に[]が必要なことに注意!)
では、最後に自前のzip関数を定義してみます。奇数リストと偶数リストを生成してzipしてみましょう。
main = print $ myZip [1, 3 .. 10] [2,4 .. 10]
where myZip [] [] = []
myZip (x:xs) (y:ys) = (x,y) : myZip xs ys
今日はここまで。
Haskell の zip 関数は与えられた 2 つのリストの長さが違っても、正常に処理が行われます。
返信削除ところが、kenken さんの myZip はリストの長さが違うとエラーになってしまいます。
定義を少し変えると、zip 関数と同じようになりますよ。
ツムジさん、
返信削除ありがとうございます。勉強になります。
こんな感じでしょうか?
myZip _ [] = []
myZip [] _ = []
myZip (x:xs) (y:ys) = [(x, y)] ++ myZip xs ys