すごい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]
今日はこのくらいにします。
次回は、再帰をやりたいと思います。