请考虑下面的函数:
validateList :: (a -> Either e a) -> [a] -> Either e [a]
validateList validate [] = Right []
validateList validate (x:xs) =
case validate x of
Left err -> Left err
Right y -> case validateList validate xs of
Left err -> Left err
Right ys -> Right $ y:ys
有没有更简洁的写法?或许可以使用
>>=
运算符吗?需要思考一下,因为这里实际上有两个单子:
[]
和 Either
,尽管 List
在这里不是作为一个单子而更像是一个 Traversable
。