次のコードを実行します。
(take 10) $! [1,2..]
それは何ですか ?「[1,2..]力を評価する」と言ったので、ghcは終了をもたらすと思いました。しかし、「[1,2,3,4,5,6,7,8,9,10]」という結果が得られました。
次のコードを実行します。
(take 10) $! [1,2..]
それは何ですか ?「[1,2..]力を評価する」と言ったので、ghcは終了をもたらすと思いました。しかし、「[1,2,3,4,5,6,7,8,9,10]」という結果が得られました。
したがって、リストが完全に評価されることが期待されます。($!) は の観点から実装されてseq
おり、seq
「のみ」はドキュメントに従って通常の形式で評価されます。undefined
値が次の場合にのみ違いがあります。
Prelude> take 0 undefined
[]
Prelude> take 0 $! undefined
*** Exception: Prelude.undefined
次の場合、関数の引数は正格です。
f undefined = undefined
これは、引数が積極的に完全に評価されることを意味するものではありません。あなたが望むのはDeepSeqのようなものです。
GHCi, version 6.10.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling DeepSeq ( deepSeq.lhs, interpreted )
Ok, modules loaded: DeepSeq.
*DeepSeq> take 1 $!! [1,2,undefined]
*** Exception: Prelude.undefined
*DeepSeq>
$!!
fromを使用した例DeepSeq
は永遠に実行されます。
強制評価は、その引数[1,2..]
が底でないことを保証するだけです。 [1,2..]
と一致(1:_)
するため、底ではなく、計算は期待どおりに進み、 が返され[1,2,3,4,5,6,7,8,9,10]
ます。
1
その単一の結果がどこから得られたのかわかりません。GHCi セッションの抜粋をコピーして貼り付けていただけませんか?
何か間違って入力しましたか?GHCi 6.8.2 では、括弧の有無にかかわらず機能します...
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
($Loading package base ... linking ... done.
Prelude> take 10 $! [1..]
[1,2,3,4,5,6,7,8,9,10]
Prelude> (take 10) $! [1..]
[1,2,3,4,5,6,7,8,9,10]
Prelude> (take 10) $! [1,2..]
[1,2,3,4,5,6,7,8,9,10]