gpt4 book ai didi

haskell - MaybeT 计算中的类型

转载 作者:行者123 更新时间:2023-12-01 09:24:06 25 4
gpt4 key购买 nike

在 IO 计算中工作,我最终得到了 case mbValue of … 的阶梯。 s 并发现我应该使用 Maybe monad 来简化代码。因为它在 IO 内计算,我需要得到 IO值,我使用了 MaybeT monad 转换器,这样我就可以 lift IO计算成 Maybe .

现在,我一直在考虑将值从其Maybe 中“剥离”。在 values <- mbValue 之后在 Maybe 内计算,但这里的启发式方法太简单了。

如下所示,当使用 Maybe a值作为 a (这里通过将它传递给 read ),它无法输入检查:

import Control.Monad.Trans (lift)
import Control.Monad.Trans.Maybe (runMaybeT)

lol :: IO (Maybe Int)
lol = return (Just 3)

lal :: IO (Maybe String)
lal = return (Just "8")

foo :: IO (Maybe Bool)
foo = do
b <- runMaybeT $ do
x <- lift lol
y <- lift lal
return (x < (read y))
return b ^-- Couldn't match type ‘Maybe String’ with ‘String’

main = foo >>= print

如果我为 return (x < (read y)) 打了一个打洞,我看到它需要 Bool ,这是有道理的,而且当前的绑定(bind)包括

||   y :: Data.Maybe.Maybe GHC.Base.String
|| (bound at /private/tmp/test.hs:14:5)
|| x :: Data.Maybe.Maybe GHC.Types.Int
|| (bound at /private/tmp/test.hs:13:5)

即,yMaybe String .这当然解释了错误,但我很困惑。我的理解哪里错了,我该如何解决这个错误?

最佳答案

简而言之:将 lift 替换为 MaybeT 构造函数。

注意

newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }

lift :: (MonadTrans t, Monad m) => m a -> t m a

你对lift的使用

x <- lift lol

是在类型

lift :: IO (Maybe Int) -> MaybeT IO (Maybe Int)

这就是为什么 x 将再次成为 Maybe Int 的原因。 lift 添加了一个新的 MaybeT 层,该层独立于您已有的 Maybe 事件。

但是

MaybeT :: m (Maybe a) -> MaybeT m a

而不是像

x <- MaybeT lol

将用于类型

MaybeT :: IO (Maybe a) -> MaybeT IO a

做正确的事。

关于haskell - MaybeT 计算中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28495819/

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