gpt4 book ai didi

haskell - 将函数应用于 IO 内的值 Maybe

转载 作者:行者123 更新时间:2023-12-02 18:41:58 26 4
gpt4 key购买 nike

我有一个类型为 a -> IO (Maybe b) 的函数我想将其应用到 IO (Maybe a)并得到IO (Maybe b) 。我写了一个函数来做到这一点:

ioMaybeApply :: (a -> IO (Maybe b)) -> IO (Maybe a) -> IO (Maybe b)
ioMaybeApply f ioMaybeA = do
maybeA <- ioMaybeA
maybe (return Nothing) f maybeA

有标准的 Haskell 函数可以做到这一点吗?我尝试用 Hoogle 进行搜索,但没有找到任何东西。如果不是,我的实现是否良好,或者可以更简单吗?

最佳答案

这可以通过MaybeT monad transformer来实现:

GHCi> import Control.Monad.Trans.Maybe
GHCi> :t \f m -> runMaybeT (MaybeT m >>= MaybeT . f)
\f m -> runMaybeT (MaybeT m >>= MaybeT . f)
:: Monad m => (a1 -> m (Maybe a)) -> m (Maybe a1) -> m (Maybe a)
import Control.Monad.Trans.Maybe

-- Making it look like your definition, for the sake of comparison.
ioMaybeApply :: (a -> IO (Maybe b)) -> IO (Maybe a) -> IO (Maybe b)
ioMaybeApply f ioMaybeA = runMaybeT $ do
a <- MaybeT ioMaybeA
MaybeT (f a)

如果您在多个地方使用此模式,则将 a -> IO (Maybe b) 函数更改为 a -> MaybeT IO b 可能会有所收获> - 那么你可以只使用 (>>=) 和/或无缝 do block 而不是你的特殊用途函数。另一方面,如果这只是一次性的,您可能会合理地认为使用 MaybeT 太过分了;在这种情况下,您的实现完全没问题。

(值得一提的是,虽然有一个名为 Compose 的嵌套仿函数通用包装器,它具有 FunctorApplicative 实例,但它没有一个 Monad 实例,因为嵌套两个 monad 并不一定会产生可以被赋予合法 Monad 实例的东西。因此,我们通常求助于为每个有效的组合。)

关于haskell - 将函数应用于 IO 内的值 Maybe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43430226/

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