类似
getFirstError :: [Either a b] -> a
getFirstError (x:y:...:Left w:z) = w
wrt Haskell但是知道其他具有模式匹配的语言如何实现这一点可能会很有趣。
答案 0 :(得分:6)
尽管有其他答案,您可以使用GHC中的视图模式扩展来执行此操作:
getFirstError ((msum . map test) -> Just x) = x
where test (Left x) = Just x
test (Right x) = Nothing
或者使用图案防护装置:
getFirstError (xs) | Just x <- (msum $ map test xs) = x
where test (Left x) = Just x
test (Right) x = Nothing
答案 1 :(得分:2)
不,但你可以使用列表理解
getFirstError xs = head [ x | Left x <- xs ]
请注意,如果没有错误,head
将失败。
答案 2 :(得分:1)
不,没有。但是,您可以使用递归轻松编写函数:
getFirstError [] = error "getFirstError: empty list or no error"
getFirstError (Left x : xs) = x
getFirstError (_ : xs) = getFirstError xs