Page List

Search on the blog

2011年4月14日木曜日

Haskell勉強記(3)

またまたHaskell。書きすぎ!?

今日は、
  1. function composition
  2. where clause
  3. 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
今日はここまで。

2 件のコメント:

  1. Haskell の zip 関数は与えられた 2 つのリストの長さが違っても、正常に処理が行われます。

    ところが、kenken さんの myZip はリストの長さが違うとエラーになってしまいます。

    定義を少し変えると、zip 関数と同じようになりますよ。

    返信削除
  2. ツムジさん、

    ありがとうございます。勉強になります。
    こんな感じでしょうか?

    myZip _ [] = []
    myZip [] _ = []
    myZip (x:xs) (y:ys) = [(x, y)] ++ myZip xs ys

    返信削除