gpt4 book ai didi

haskell - 将 Eithers 列表转换为包含列表的 Either

转载 作者:行者123 更新时间:2023-12-03 14:57:38 27 4
gpt4 key购买 nike

我是 Haskell 的初学者,我正在编写一些使用 Either 的 Haskell 代码用于错误处理。 Either 的左侧元素表示错误,而右侧元素表示成功的结果。代码经常使用 Either 的 Applicative 实例,似乎是为这个用例设计的。

给定 [Either e r] 类型的对象,将其转换为 Either e [r] 类型的对象的最优雅方法是什么? ?关键是我们可能有一个来自我们调用的某些函数的返回值数组,如果这些返回值中的任何一个是错误的,我们希望得到那个错误并丢弃其他所有内容。如果数组的多个元素有错误,我希望尽可能得到最左边的错误。

我可以通过编写两个函数在下面的代码中自己解决这个问题,其中一个是递归的,但是有更好的方法吗?

type Error = [Char]

myFunc :: [Either Error a] -> Either Error [a]
myFunc = myFunc2 []

myFunc2 :: [a] -> [Either Error a] -> Either Error [a]
myFunc2 r ((Left error):rest) = Left error
myFunc2 r ((Right item):rest) = myFunc2 (r ++ [item]) rest
myFunc2 r [] = Right r

main :: IO()
main = do
-- This prints: Right [1, 2, 3]
putStrLn (show (myFunc [Right 1, Right 2, Right 3]))

-- This prints: Left "division by zero"
putStrLn (show (myFunc [Right 1, Left "division by zero", Right 3]))

最佳答案

sequence 来自 Control.Monad :

sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)

如:
\> import Control.Monad (sequence)

\> sequence [Right 1, Right 2, Right 3]
Right [1,2,3]

\> sequence [Right 1, Left "division by zero", Right 3]
Left "division by zero"

关于haskell - 将 Eithers 列表转换为包含列表的 Either,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38164997/

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