我不完全清楚seq在Haskell中的工作方式。你會不會寫seq x x?
現在看來似乎有很多情況下,這將是有益寫
seq x x
的,甚至可能定義一個函數:
strict x = seq x x
,但這樣的功能已經不存在所以我猜這種方法有點不對勁。有人能告訴我這是否有意義或有用嗎?
我不完全清楚seq在Haskell中的工作方式。你會不會寫seq x x?
現在看來似乎有很多情況下,這將是有益寫
seq x x
的,甚至可能定義一個函數:
strict x = seq x x
,但這樣的功能已經不存在所以我猜這種方法有點不對勁。有人能告訴我這是否有意義或有用嗎?
seq a b
返回b
的值,但使該值取決於a
的評估。因此,seq a a
與a
完全一樣。
我覺得這裏的誤區是seq
沒有采取任何行動,因爲純粹的函數不採取行動,它只是引入了依賴關係。
有一個功能evaluate :: a -> IO()
在Control.Exception
做你想做的(注意它在IO
)。他們把它放在異常中,因爲看看錶達式的評估是否會拋出是有用的,如果是這樣,則處理異常。
seq x x
將是完全瑣碎的冗餘。
請記住,seq
是不是命令。在您的程序中是否存在seq a b
並不強制對a
或b
進行評估它會做什麼?是否對結果進行人爲評估取決於對a
的評估,即使結果本身是b
如果您打印出seq a b
, a
將被評估並且其結果被丟棄。由於x
已經取決於其本身,所以seq x x
是愚蠢的。
表達x = seq a b
意味着如果x
被評估,然後a
也將進行評估(但x
將等於b
)。
它確實不是的意思是「現在評估a
」。
請注意,如果x
正在評估,那麼因爲x
等於b
,那麼b
也將被評估。
因此,如果我寫x = seq a a
,我說「如果x
評估,然後評估a
」。但如果我只是做x = a
,那會達到完全一樣的東西。
我相信你的意思是'a'也會在第一句話中被評估。 –
當你說seq a b
你說的是計算機,
每當你需要評估
b
,對我評價a
過,請。
如果我們x
同時取代a
和b
你可以看到爲什麼也沒用寫seq x x
:
每當你需要評估
x
,對我評價x
過,請。
問計於計算機評估x
時,它需要評估x
只是做了無用的東西 - 它打算無論如何要評估x
!
seq
不不評估什麼 - 它只是告訴當你需要的第二個參數,也是評估的第一個參數的計算機。理解這一點實際上非常重要,因爲它可以讓你更好地理解程序的行爲。
你讀過[維基]( http://www.haskell.org/haskellwiki/Seq)?它很好地解釋了'seq'的細微差別,因爲它並不完全簡單。 – bheklilr
「特別是,''x'seq' x''這個表達式是完全多餘的,並且總是和寫'x'一樣的效果。」 –
相關:[this answer](http://stackoverflow.com/ a/19805521/925978),更重要的是下面的評論。 – crockeea