8

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の初心者として)何が欠けていますか?

4

1 に答える 1

15

あなたが見逃しているのは、GHCiがIOアクションの結果も出力することです(それらが表示され、表示されない場合)()。これにより、通常の形式に評価されます。代わりに試してください:

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x >> return ()
foo
于 2015-10-12T15:01:39.197 に答える