Monday 5 August 2013

Haskell 入門! (5)

ローカルにちょっと定義をする,みたいな話.

en.wikibooks  の Haskell (pdf version) より.
CC-BY-SA での配布です.



Local definitions

where clauses

その関数の中でしか使わへんようなやつをいちいちきちんと定義するのもアレなので.
Heron の公式 (A = \sqrt{s (s-a) (s-b) (s-c)} where s = (a+b+c)/2) ですがこれを Haskell でそのまま書けて
heron a b c = sqrt ( s*(s-a)*(s-b)*(s-c) )
    where 
    s = (a+b+c) / 2
where と local definitions はスペース4つでインデントして区別されます.
このへん python みたいに whitespace sensitive なわけですねー.
そしてこれを,
heron a b c = sqrt ( s*(s-a)*(s-b)*(s-c) ) -- s はここでは定義されてない
s = (a+b+c) / 2  -- ここでは a, b, c が定義されてない
と書くと, s = (a+b+c)/2 のところは heron の右辺の定義の一部としては解釈されないので,
所定の結果は得られません.
他の例.
areaTriangleTrig a b c = c * height / 2 --三角関数で
    where
    cosa = (b^2 + c^2 - a^2) / (2*b*c) --余弦定理
    sina = sqrt(1 - cosa^2)
    height = b * sina

areaTriangleHeron a b c = result --ヘロンの公式から
    where
    result = sqrt(s*(s-a)*(s-b)*(s-c))
    s = (a+b+c) / 2

Scope

上の例で a とか b とか c とかたくさん出てきたけど,大丈夫なんか.
これはありがたいことに思ったとおりに動く:(let のことは一旦おいといて.)
Prelude> let r = 0
Prelude> let area r = pi * r^2
Prelude> area 5
最初に r = 0 といってるから area r = pi * r^2 で問答無用に 0や! とはなりません.
要するに 2つの r は別のものを指してるというわけ.
詳しくはここでは省くけど, scope っていう(他の言語にもあるよね)仕組みで上手くいくようになってるかんじです.
つまり,= で結ぶと,以降その定義の scope に照らして適切である範囲で右辺と置き換えられる,みたいな.
感じ.詳細がなくてすっきりしないけど.

ついでにもうひとつ話をします.


Truth Values

Equality and other comparisons / Boolean Values

アレだ,数学で = って書いてもどっちかいうと proposition としてのそれがあるようなかんじで. 2つの値の比較には == を使う.
Prelude> 2 + 3 == 5
True
True あるいは False が帰ってくる.大小比較は >, <, <=, >= で.
Main*> area 5 < 50
みたいな書き方ももちろん出来ます.
帰ってくる True とかは Boolean values, ないし truth values と呼ばれます.お見知りおきを.

きょうはここまで.

No comments:

Post a Comment