我執行下面的代碼:
(take 10) $! [1,2..]
這是什麼?我想,ghc會產生一個終止,因爲我說「評估[1,2 ..]力量」。但是我得到了結果「[1,2,3,4,5,6,7,8,9,10]」。
我執行下面的代碼:
(take 10) $! [1,2..]
這是什麼?我想,ghc會產生一個終止,因爲我說「評估[1,2 ..]力量」。但是我得到了結果「[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>
您與$!!
從DeepSeq
運行永遠例子。
你輸錯了什麼?它爲我帶或不帶括號,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]
我的GHC給我的結果與你的ghc相同。但這是結果不能令我滿意。我想要終止。 與具有多個參數的curried函數一起使用時,可以使用嚴格的應用程序來強制對任何參數組合進行頂級評估。例如,如果f是具有兩個參數的curried函數,則應用程序 可以修改fxy的形式以具有三種不同的行爲: (f $!x)y強制執行x的頂級評估(fx)$ ! y強制頂級評估y (f $!x)$! y強制頂級評估x和y – Anton
根據您的圖像,您*正在按照您的要求獲取[1,2,3,4,5,6,7,8,9,10]。你爲什麼說你得到結果「1」? – ShreevatsaR
對不起。最初我想打印另一個例子。 – Anton