gpt4 book ai didi

haskell - 递归liftIO

转载 作者:行者123 更新时间:2023-12-02 12:44:32 25 4
gpt4 key购买 nike

我查看了 MonadTrans 的一些实例,对于 MaybeT,其实现如下所示:

instance MonadTrans MaybeT where
lift = MaybeT . liftM Just
据我了解,MonadIO 的实例用于从最内部(IO monad)直接到最外部进行可变数量的提升。对于 MaybeT 案例,它看起来像这样:

instance (MonadIO m) => MonadIO (MaybeT m) where
liftIO = lift . liftIO

我不明白的是这个递归函数如何逃脱无限循环。基本情况是什么?

最佳答案

也许令人惊讶的是,下面的定义不是递归的,即使它看起来是这样。

instance (MonadIO m) => MonadIO (MaybeT m) where
liftIO = lift . liftIO

这是因为左侧的 liftIOMaybeT m 单子(monad)的 liftIO,而 liftIO 右侧是 m monad 的 liftIO

因此,这只是根据另一个 monad 的 liftIO 来定义一个 monad 中的 liftIO。这里没有递归。

这类似于例如

instance (Show a, Show b) => Show (a,b) where
show (x,y) = "(" ++ show x ++ ", " ++ show y ++ ")"

上面,我们根据如何打印它们的组件来定义如何打印一对。它看起来是递归的,但事实并非如此。

它可以通过插入显式类型参数来帮助可视化这一点,至少在心理上是这样:

-- pseudo-code
instance (Show a, Show b) => Show (a,b) where
show @(a,b) (x,y) =
"(" ++ show @a x ++ ", " ++ show @b y ++ ")"

现在,show @(a,b)show @ashow @b 是不同的函数。

关于haskell - 递归liftIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42925365/

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