Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 模式与monad中的值匹配_Haskell_Monads_Monad Transformers - Fatal编程技术网

Haskell 模式与monad中的值匹配

Haskell 模式与monad中的值匹配,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我在haskell中获得了以下数据类型: data Flow a = Continue a | Return Value newtype FlowT m a = FlowT {runFlowT :: m (Flow a)} type IStateM a = FlowT (StateT IState IO) a 其中IState是一些记录类型,包含一些列表等。FlowT的Monad和MonadTrans实例定义如下: instance (Monad m) => Monad (FlowT m

我在haskell中获得了以下数据类型:

data Flow a = Continue a | Return Value
newtype FlowT m a = FlowT {runFlowT :: m (Flow a)}
type IStateM a = FlowT (StateT IState IO) a
其中IState是一些记录类型,包含一些列表等。FlowT的Monad和MonadTrans实例定义如下:

instance (Monad m) => Monad (FlowT m) where
x >>= f = FlowT $ do
                    unwrapped <- runFlowT x
                    case unwrapped of
                        Continue v -> runFlowT (f v)
                        Return r -> return $ Return r
return x = FlowT $ return (Continue x)


instance MonadTrans FlowT where
    lift m = FlowT (Continue `liftM` m)

instance (MonadIO m) => MonadIO (FlowT m) where
    liftIO m = lift (liftIO m)

instance (MonadState s m) => MonadState s (FlowT m) where
    put k = lift (put k)
    get = lift get
instance(Monad m)=>Monad(FlowT m)其中
x>>=f=FlowT$do
未包装的runFlowT(f v)
Return r->Return$Return r
返回x=FlowT$返回(继续x)
实例MonadTrans FlowT,其中
升程m=FlowT(续'liftM`m)
实例(MonadIO m)=>MonadIO(FlowT m)其中
升力m=升力(升力m)
实例(MonadState s m)=>MonadState s(FlowT m),其中
放置k=提升(放置k)
得到

我的意图是,在我正在为其开发解释器的玩具语言中,您可以随时通过调用带有某种表达式的return从函数返回。现在,当我编写代码来解释函数调用时,我需要提取在这个monad中幕后传递的流值。我无法与IState()进行模式匹配,因为它包含IO。我需要的函数应该以与State的get类似的方式工作——我调用它并可以检查是否有返回的值,如果有,我得到它,如果没有,让我们说返回了value类型的特殊值或其他什么。如何执行此操作?

要对值进行模式匹配,必须在给定的monad中绑定其结果,与在
monad
实例中执行的方式完全相同:

interpret :: FlowT m a -> m a
interpret flow = do
    value <- runFlowT flow
    case value of
        Continue v -> ...
        Return   r -> ...
这提供了一个同构类型,具有完全相同的行为和相同的
Monad
MonadTrans
实例


但回到您的具体问题:不,如果不先将结果绑定到基单子中,就无法对值进行模式匹配。

我不知道这是怎么可能的,但我很确定我以前尝试过,但它不起作用。然而,在阅读了你的帖子并重写了我的代码之后,我神奇地让它工作了。我不知道出了什么问题:)我不知道Control.Monad.Trans.Free。谢谢你的帮助这也发生在我身上,别担心
import Control.Monad.Trans.Free  -- from the 'free' package
import Data.Functor.Constant     -- from the 'transformers' package

type FlowT = FreeT (Constant Value)