Haskell の, は (一般的に)最初の引数をWHNFに減らし、この動作が GHCi で期待どおりであることを理解しています (と思います)。seq
λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in seq x 0
foo
0
ただし、のドキュメントでevaluate
は、引数を WHNF に減らすとも書かれていますが、実際には引数を完全に通常の形式に減らしているようです。
λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x
foo
Foo bar
(Bar 100)
この(明らかな)不一致を確認できます
λ> let y = (trace "foo" Foo (trace "bar" Bar 100))
λ> seq y 0
foo
0
λ> :sprint y
y = <Foo> _
と
λ> let z = (trace "foo" Foo (trace "bar" Bar 100))
λ> evaluate z
foo
Foo bar
(Bar 100)
λ> :sprint z
z = <Foo> (<Bar> 100)
のドキュメントevaluate
が正しい場合、seq
との動作はevaluate
同じであるべきではありませんか? ここで(Haskellの初心者として)何が欠けていますか?