週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(&&)関数と(||)関数@結城浩のHaskell日記より。 結城さんはもうこの辺解決していらっしゃるかもしれませんが。

ショートカットという言葉は、評価に必要ない計算はしないという意味だと思います。 そして、そもそもHaskellは値が必要になるまで計算をしません。 たとえば

one :: Int -> Int
one x = 1
のような引数を全く解釈しない関数を用意します。この関数は、引数として何を与えても1を返してきます。本当に何を与えても。
>one 1
    -> 1
>one 3
    -> 1
>one $ error "hello"
    -> 1
>one $ length [1..]
    -> 1
このように、エラーや無限ループを与えても動じません。

今のような、エラーや無限ループのことを以下では⊥(矛盾、ボトムとか読みます)と表します。 そして今のような、⊥を与えても⊥以外のちゃんとした値が帰ってくる関数をlazyな関数といいます。 一方、ふつうの、⊥を引数に与えると必ず⊥が返る、つまり帰ってこなかったりエラーになったりする関数は、strictな関数といいます。

さて、&&や||についてはどうでしょう。これらは片方の引数を評価して、その値によってはもう片方は評価しなくても良くなります。そして数学的には二つの引数は対等なので、どちらから評価されてもよさそうです。しかしどちらかの引数に⊥を与えられたらどうなるのでしょう。

定義を見れば一目瞭然です。

(&&), (||)  :: Bool -> Bool -> Bool
False && x   = False
True  && x   = x
False || x   = x
True  || x   = True
たとえばライブラリでこのように定義されていたとすると、 一番目の引数については必ず評価されます。 しかし二番目の引数は、一番目の引数次第では評価されません。
> error "a" && True
    Program error: a

> error "a" && False
    Program error: a

> True && error "a"
    Program error: a

> False && error "a"
    False
先ほどの言葉でいうと、(&&)や(||)は一番目の引数についてはstrictですが 二番目の引数に対してはlazyな関数です。 あるいはカリー化して言うと、(&&)や(||)はstrictな関数ですが、 引数をひとつ与えて帰ってくる関数はstrictではないかもしれません、といえます。

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/67-96fe0457
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。