成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

すごいHaskellたのしく学んでみる-その3

前回から、しばらく経ちましたが、
なかなか読み進まなかったので、書いてませんでした。

というのも、正直2章の内容を理解しきれなくて、、、
理解できないというか、イメージができないというか、
型クラスのインスタンスが型と言われても、
正直よくわからない。


多分、自分で書いてみないとよくわからないなぁ、と思っていた所、
7章あたりでやりそうなので、
とりあえず、先に進む事にしました。

というわけで、今日のテーマは、、、

  • ガード
  • where
  • let

です。

ガード

条件式がTrueを返す場合の式を書いていく感じです。

tell :: Integer -> String
tell num
  | num < 10 = "under 10"
  | num == 10 = "just 10"
  | num > 10 = "over 10"

どの条件にも一致しないものは「otherwise」と記述します。

tell :: Integer -> String
tell num
  | num < 10 = "under 10"
  | num == 10 = "just 10"
  | num > 10 && num <= 20 = "over 10"
  | otherwise = "over 20"

where

whereは関数内のスコープに関数を定義する感じでしょうか。

tell :: Integer -> String
tell num
    | num < ten = "under 10"
    | num == ten = "just 10"
    | num > ten && num <= twenty = "over 10"
    | otherwise = "over 20"
    where ten = 10
          twenty = 20

whereでパターンマッチを使ってみます。

initials :: String -> String -> String
initials firstname lastname = [f, '.', l]
  where (f:_) = firstname
        (l:_) = lastname

これは、where使わないで、普通に引数をパターンマッチすれば良い気もしますね。

initials :: String -> String -> String
initials (f:_) (l:_) = [f, '.', l]

let

letはもっと短いスコープで関数定義できるようなイメージ、、、なんですかね。

100 + (let ten = 10 in ten) + 200

この例は、全く無意味ですね、、、
ただ、これは結構大事な事だと思います。
というのも、letは式だということです。
式だということは必ず値を返します。
なので、↑のようにインラインで使う事ができるんですね。


もちろんletでもパターンマッチが使えるので、
ここでもパターンマッチしてみたいと思います。

Prelude> let hoge = (1,2,3)
Prelude> let (a,b,c) = hoge in a+b+c
6

なるほど、こういう使い方は用途がイメージできますね。


letはリスト内包表記でも使う事ができます。

multiplication :: [(Int, Int)] -> [Int]
multiplication xs = [multi | (a, b) <- xs, let multi = a * b]


今日はこのくらいにします。
次回は、再帰をやりたいと思います。