报告所有错误的类似序列的函数

vid*_*idi 15 haskell

我正在标准库中寻找一个函数,其签名与此类似:

Traversable f => f (Either e a) -> Either [e] (f a)
Run Code Online (Sandbox Code Playgroud)

或者可能是这样的:

(Traversable f, Monoid e) => f (Either e a) -> Either e (f a)
Run Code Online (Sandbox Code Playgroud)

这个想法是收集错误而不是在遇到第一个错误时失败。

我看到我的函数看起来很像sequence,我希望已经有一个类型类来建模这种模式。

Nou*_*are 18

您可以Validation为此使用数据类型。从文档:

[A]Validation是任一类型的值erra,类似Either。但是,Applicative实例 for使用onValidation 累积错误。相反,for只返回第一个错误。SemigrouperrApplicativeEither

例如:

> sequenceA [Failure [1], Success "Test", Failure [2] :: Validation [Int] String]
Failure [1, 2]
Run Code Online (Sandbox Code Playgroud)

  • @luqui 的一个问题是单子法则规定单子 `ap` (`p >>= \f -> q >>= \x -> return (fx)`) 必须与 `<*>` 相同。但这与错误的累积行为不兼容。所以“Validation”实际上并不是“Monad”的一个实例。 (2认同)