- 252 名前:246 mailto:sage [04/10/15 21:53:07]
- 評価という言葉を誤用したみたいです。
putStr "Hello " >> putStr "World"は、 "Hello "を出力する動作の後に、"World"を出力する動作を続けた動作と解釈される。 と言いかえるべきなのかな。 (1+3) : []を、(4ではなく)1+3を空のリストに加えたものと解釈される。 というのと同じで、この1+3が4になるのはmainに関連づけられたとき (とhugsなどで、返り値の表示を求められたとき)のみである。 つまり、putStr "Hello " >> putStr "World"が左から評価されるのは、 print ((1+2):(2+3):[])が左から評価されるのと同様、 値が必要になった時点で評価されるという、遅延評価の性質から理解できる。 print ((1+2):(2+3):[])でまず1+2が、つぎに2+3が評価されるのは、 (:)に左から順に評価するという性質があるのではなく、 必要とされるのが1+2のほうが先であるというためである。 これは、print $ reverse ((1+2):error "foo":(2+3):[])の出力が[5,となる点からも確認できる。 それと同様にputStr "Hello " >> putStr "World"が左から評価されるのは、 まずputStr "Hello "がプログラムの実行に必要とされ、その後にputStr "World"が必要とされるためであり、 (>>)が左から評価されるといった性質を持っている必要はない。 (しかし、(>>)の右側が左側よりも先に必要とされるという状況は考えられないので(>>)が左から評価される性質を持つというのは そんなに間違いではないかもしれない。) putStr "Hello " >> error "Error."がうまく評価されるのも同様で、 "Hello "の出力の際にはerror "Error."を評価する必要がないためである。 現時点での僕の解釈ですので、間違いもあると思います。 Haskellに積まれた概念は非常に興味深いので、 今後も熟考していこうと思っています。
|

|