Tuesday 6 August 2013

Haskell 入門! (6)

いろいろ.関数の中置とか,「2 と True は等しいか」とか.

en.wikibooks の Haskell から.
CC-BY-SA での配布です.


An introduction to types(小声)

Type の話だ!楽しみにしましょう!わーい!
…といきたいところですが,その前に関数の話をもう少しします……
ほんとの話は次次回,今日は昨日の boolean values の一応続き.


Truth values が values というてるけど,これはマジでそういうことで, 数値と同じ意味で値を持ってる.
例えば
Prelude> True == True
True
Prelude> True == False
False
ってな感じ.では「2 と True は等しいでしょうか?」
Prelude> 2 == True

<interactive>:3:1:
    No instance for (Num Bool) arising from the literal `2'
    Possible fix: add an instance declaration for (Num Bool)
    In the first argument of `(==)', namely `2'
    In the expression: 2 == True
    In an equation for `it': it = 2 == True
そんな比較はできません.上で ghci さんが何を言ってるのかは後ほど読めるようになる.
左辺は数 (type としては Num), 右辺は Boolean value (Bool)
型 (type) が違うので,比較のしようがないのです.
これまでは ghci が勝手に解釈してくれていましたが,自分で型を指定することもでき,
Haskell のこの型システムは,ちゃんと意味が通るように物事を動かす上で非常に強力です.
超大事で格好いいので次の章はこの型の話.その前に今の話を片付けてしまいましょう.

Infix operators

さっきの 2 と True を調べた時,
In the first argument of `(==)', namely `2'
さて ghc さんは 2 を first argument of (==) と呼んでるわけやけれども,この (==) も普通の函数.
ただ syntax 的にちょっと違って, Haskell ではこういう,
名前が英数以外の記号だけでできてる 2 変数関数 は中置できることになってるらしい.
infix operators, と呼ぶそうな.普通の関数みたいに使うときは ( ) でくくる.
Prelude> (==) (4 + 9) 13
True
前にちょっと触れた (+) とかもこの類ですね.
逆にさっきの areaRect みたいな関数を中置したい時は ` ` でくくって
2 `areaRect` 5
と書ける.これではあんまり嬉しさもないけど,3 `mod` 2 みたいな書き方は素敵そう.
というわけで(?) ==+ >= もなんでもかんでも関数です.

というわけで論理演算子をいくつか置いておきますので
お見知りおきを

Boolean operations

and は (&&), or は (||), not で論理否定.
いずれもさっきの infix operator な記法に従います.
Prelude> (3 < 8) && (False == False)
True
Prelude> (&&) (3 < 8) (False == False)
True
Prelude> not (5*2 == 10)
False
みたいな感じ.なお, not equal to については /= (\neq に形を似せたという噂?) とも書ける.あえて書くなら
x /= y = not (x == y)
というかんじ(この書き方で完全に正しい).一瞬あれって思うかもしれないが落ち着いて.

No comments:

Post a Comment