我看到這里
-- Note that "forever" isn't necessarily non-terminating.
-- If the action is in a @'MonadPlus'@ and short-circuits after some number of iterations.
-- then @'forever'@ actually returns `mzero`, effectively short-circuiting its caller.
老實說,我不明白這個注釋。他們是否意味著有可能打破forever,MonadPlus例如 - IO Bool?比方說,IO False會打破它...
從一個角度來看IO也是MonadPlus如此。也許我必須用IO Bool其他東西包裹起來才能實作forever與IO Booland決裂的可能性MonadPlus?注釋到底是什么意思?
當然,我可以破例打破它或實施自己的forever,但我的興趣是關于這個奇怪的筆記。
uj5u.com熱心網友回復:
你可以看看是如何forever實作的:
forever :: Applicative f => f a -> f b -> f b
forever a = let a' = a *> a' in a'
的檔案(*>)說它“對動作進行排序,丟棄第一個引數的值”。它基本上是(>>)適用于 Applicatives 而不是 Monads。
所以如果你看看forever它是如何實作的,你會發現它基本上被擴展為:
forever a = a *> a *> a *> ...
正如forever描述所說,如果 Applicative 有一些短路行為,它仍然可以終止并且不評估無限的動作序列:
ghci> forever $ Nothing
Nothing
ghci> forever $ Just 1
-- infinite loop trying to evaluate Just 1 *> Just 1 *> Just 1 *> ...
那是因為(Nothing *> _) = Nothing后面的(*>)甚至沒有被評估,所以Nothing *> Nothing *> Nothing *> ...短路到Nothing無需評估無限的動作串列。
uj5u.com熱心網友回復:
人們可能會天真地假設這forever m會永遠持續下去:
forever m = m >> forever m
= m >> m >> forever m
= m >> m >> m >> ... -- forever
但是評論提到有打破回圈的方法,并且mzero是一個簡潔的例子,它以等式方式而不是通過從操作上考慮例外來說明情況。mzero滿足mzero >> w = mzero所有人w,因此:
forever mzero = mzero >> forever mzero
= mzero
關鍵是 monad 的選擇比命令式語言中的單純回圈forever更加通用。while (true)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487883.html
標籤:哈斯克尔
