Haskell 模式与monad中的值匹配
我在haskell中获得了以下数据类型: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
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)