2009-10-17 18 views
3

我執行下面的代碼:

(take 10) $! [1,2..] 

這是什麼?我想,ghc會產生一個終止,因爲我說「評估[1,2 ..]力量」。但是我得到了結果「[1,2,3,4,5,6,7,8,9,10]」。

+0

根據您的圖像,您*正在按照您的要求獲取[1,2,3,4,5,6,7,8,9,10]。你爲什麼說你得到結果「1」? – ShreevatsaR

+0

對不起。最初我想打印另一個例子。 – Anton

回答

12

所以你期望列表得到充分評估。 ($!)按照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運行永遠例子。

+0

您能否給我這個文檔? ) – Anton

+0

我只是指「seq :: a - > b - > b」的文檔,其中寫着:「將其第一個參數評估爲標準形式,然後返回其第二個參數作爲結果。」 –

+0

非常感謝! – Anton

2

你輸錯了什麼?它爲我帶或不帶括號,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] 
+0

我的GHC給我的結果與你的ghc相同。但這是結果不能令我滿意。我想要終止。 與具有多個參數的curried函數一起使用時,可以使用嚴格的應用程序來強制對任何參數組合進行頂級評估。例如,如果f是具有兩個參數的curried函數,則應用程序 可以修改fxy的形式以具有三種不同的行爲: (f $!x)y強制執行x的頂級評估(fx)$ ! y強制頂級評估y (f $!x)$! y強制頂級評估x和y – Anton

4

強制評估將只能保證它的參數[1,2..]不是底部。 [1,2..]匹配(1:_),所以它不是底部,計算將按預期繼續,返回[1,2,3,4,5,6,7,8,9,10]

不知道你從哪裏得到那個單一的1結果;你會介意複製GHCi會話的摘錄嗎?

+0

不幸的是,新用戶不會發布圖片。 – Anton

+0

http://img111.imageshack.us/img111/651/66718556.jpg – Anton

+5

當然,對於兩行文本,您*可以*將它們複製爲文本;) –