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