我在 Haskell 中有一个函数,其返回类型是 Either error b
,
并且有“function x = Right b1
”,对于“function (x:xs) b =
我想得到类似 Right [list of b's]
的东西。我真的不知道如何解释,我是 haskell 的新手。我尝试过: function (x:xs) = function x <$> function xs
和
function (x:xs) b = function x b <*> function xs b
,但我收到类型不匹配错误。我唯一想要的就是不要 [Right b1, Right b2, ...]
但是,Right [b1, b2, b3]
.
最佳答案
如果你的函数是f :: <i>a</i> -> Either <i>b</i> <i>c</i>
,那么你实际上已经非常接近了,您可以通过以下方式实现:
function :: [<i>a</i>] -> Either <i>b</i> [<i>c</i>]
function [] = Right []
function (x:xs) = <b>(:) <$></b> f x <b><*></b> function xs
但是没有必要自己实现这个。这是 traverse :: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
的一个特例。它可以在任何 Traversable
上执行此操作数据结构,因此您可以使用:
function :: [<i>a</i>] -> Either <i>b</i> [<i>c</i>]
function = traverse f
如果其中一个函数调用返回 Left …
,将返回列表中的第一项。
关于haskell - 组合任一类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66805476/