作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的程序使用 Tardis 提供的后退状态。单子(monad)。
{-# LANGUAGE RecursiveDo #-}
import Control.Monad.Tardis
lastOccurrence :: Int -> Tardis [Int] () Bool
lastOccurrence x = mdo
sendPast (x : xs)
xs <- getFuture
return (not (elem x xs))
lastOccurrences :: [Int] -> Tardis [Int] () [Bool]
lastOccurrences xs = mapM lastOccurrence xs
main :: IO ()
main =
print $ flip evalTardis ([], ()) $ lastOccurrences [3,4,6,7,4,3,5,7]
main
永远循环而不是打印
[False,False,True,False,True,True,True,True]
和上面的程序一样。
{-# LANGUAGE RecursiveDo #-}
import Control.Monad.RevState
lastOccurrence :: Int -> State [Int] Bool
lastOccurrence x = mdo
put (x : xs)
xs <- get
return (not (elem x xs))
lastOccurrences :: [Int] -> State [Int] [Bool]
lastOccurrences xs = mapM lastOccurrence xs
main :: IO ()
main =
print $ flip evalState [] $ lastOccurrences [3,4,6,7,4,3,5,7]
最佳答案
我现在已经下载了这两个 Tardis
的源代码。和 RevState
,然后我开始对它们进行黑客攻击,直到它们几乎相同:
Trans.{Tarids,RevState}
之外的所有内容模块,这样我就不必担心类型类 Tardis
的前向传播状态Tardis
至State
Tardis
的情况。 -使用示例仍然有效,您的
RevState
- 使用示例仍然不起作用,它们的差异很小。
MonadFix
实例。
Tardis
has this :
instance MonadFix m => MonadFix (TardisT bw fw m) where
mfix f = TardisT $ \s -> do
rec (x, s') <- runTardisT (f x) s
return (x, s')
RevState
has this :
instance MonadFix m => MonadFix (StateT s m) where
mfix f = StateT $ \s ->
mfix (\(x, _) -> runStateT (f x) s)
RevState
一个在元组构造函数中是严格的,而
Tardis
一是懒惰。 (参见例如
GHC documentation on RecursiveDo
以查看
Tardis
一个在传递给
mfix
的 lambda 中转化为无可辩驳的模式匹配)。
RevState
的实现以便
instance MonadFix m => MonadFix (StateT s m) where
mfix f = StateT $ \s -> do
mfix (\ ~(x, _) -> runStateT (f x) s)
RevState
- 使用程序。
关于haskell - Haskell 中的逆向因果关系 : From Tardis to RevState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34030388/
下面的程序使用 Tardis 提供的后退状态。单子(monad)。 {-# LANGUAGE RecursiveDo #-} import Control.Monad.Tardis lastOccur
我是一名优秀的程序员,十分优秀!