有没有办法在列表中间模式匹配值?还是在最后?

时间:2011-07-09 11:31:24

标签: haskell pattern-matching

类似

getFirstError :: [Either a b] -> a
getFirstError (x:y:...:Left w:z) = w

wrt Haskell但是知道其他具有模式匹配的语言如何实现这一点可能会很有趣。

3 个答案:

答案 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