gpt4 book ai didi

Haskell - 如何将两个单子(monad) Maybe 函数组合成一个函数

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

假设我有这两个数据记录 X 和 Y 以及以下两个函数:

f1 :: IO (Maybe [X])
f2 :: X -> IO (Maybe Y)

我需要首先调用f1,然后对于返回列表的每个元素(存储在IO(可能)中)调用f2 >,这会导致类似 IO (Maybe [IO (Maybe Y)]) 的结果。我怎样才能将它们组合起来以获得有意义的东西,例如

result :: Maybe (IO [Y])

result :: IO (Maybe [Y])

非常感谢您的帮助:-)

最佳答案

本质上它正在使用 fmap sequenceA . sequenceA . fmap f2

使用do语法并一次一步地分解它:

resultresult'给你相同的结果。

data X = X
data Y = Y

f1 :: IO (Maybe [X])
f1 = undefined

f2 :: X -> IO (Maybe Y)
f2 = undefined

result :: IO (Maybe [Y])
result = do
f1' <- f1
case f1' of
Just f1'' -> do
let a = fmap f2 f1'' :: [IO (Maybe Y)]
let b = sequenceA a :: IO [Maybe Y]
fmap sequenceA b :: IO (Maybe [Y])
Nothing -> pure Nothing

result' :: IO (Maybe [Y])
result' = do
f1' <- f1
case f1' of
Just f1'' -> do
fmap sequenceA . sequenceA . fmap f2 $ f1''
Nothing -> pure Nothing

关于Haskell - 如何将两个单子(monad) Maybe 函数组合成一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867446/

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