gpt4 book ai didi

haskell - Haskell 中的逆向因果关系 : From Tardis to RevState

转载 作者:行者123 更新时间:2023-12-03 20:41:26 27 4
gpt4 key购买 nike

下面的程序使用 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]

如何用 reverse State 替换 Tardis monad单子(monad)?
根据我的以下建议, 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 的前向传播状态
  • 我改名为 TardisState

  • 在对代码进行了一些重新排序后,我最终遇到了您的 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com