2014-05-09 12 views
9

我不完全清楚seq在Haskell中的工作方式。你會不會寫seq x x?

現在看來似乎有很多情況下,這將是有益寫

seq x x 

的,甚至可能定義一個函數:

strict x = seq x x 

,但這樣的功能已經不存在所以我猜這種方法有點不對勁。有人能告訴我這是否有意義或有用嗎?

+0

你讀過[維基]( http://www.haskell.org/haskellwiki/Seq)?它很好地解釋了'seq'的細微差別,因爲它並不完全簡單。 – bheklilr

+0

「特別是,''x'seq' x''這個表達式是完全多餘的,並且總是和寫'x'一樣的效果。」 –

+0

相關:[this answer](http://stackoverflow.com/ a/19805521/925978),更重要的是下面的評論。 – crockeea

回答

18

seq a b返回b的值,但使該值取決於a的評估。因此,seq a aa完全一樣。

我覺得這裏的誤區是seq沒有采取任何行動,因爲純粹的函數不採取行動,它只是引入了依賴關係。

有一個功能evaluate :: a -> IO()Control.Exception做你想做的(注意它在IO)。他們把它放在異常中,因爲看看錶達式的評估是否會拋出是有用的,如果是這樣,則處理異常。

5

seq x x將是完全瑣碎的冗餘。

請記住,seq不是命令。在您的程序中是否存在seq a b並不強制對ab進行評估它會做什麼?是否對結果進行人爲評估取決於對a的評估,即使結果本身是b如果您打印出seq a ba將被評估並且其結果被丟棄。由於x已經取決於其本身,所以seq x x是愚蠢的。

8

表達x = seq a b意味着如果x被評估,然後a也將進行評估(但x將等於b)。

它確實不是的意思是「現在評估a」。

請注意,如果x正在評估,那麼因爲x等於b,那麼b也將被評估。

因此,如果我寫x = seq a a,我說「如果x評估,然後評估a」。但如果我只是做x = a,那會達到完全一樣的東西

+1

我相信你的意思是'a'也會在第一句話中被評估。 –

5

當你說seq a b你說的是計算機,

每當你需要評估b,對我評價a過,請。

如果我們x同時取代ab你可以看到爲什麼也沒用寫seq x x

每當你需要評估x,對我評價x過,請。

問計於計算機評估x時,它需要評估x只是做了無用的東西 - 它打算無論如何要評估x

seq評估什麼 - 它只是告訴你需要的第二個參數,也是評估的第一個參數的計算機。理解這一點實際上非常重要,因爲它可以讓你更好地理解程序的行爲。

1

關閉! deepseq(這是「更徹底」 seq - 看到完整的說明該文檔)的類型爲NFData a => a -> b -> b,並force(與NFData a => a -> a型)被簡單地定義爲

force :: (NFData a) => a -> a 
force x = x `deepseq` x