Есть ли способ сопоставить шаблон со значением в середине списка?или в конце? - PullRequest
2 голосов
/ 09 июля 2011

что-то вроде

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

по отношению к Haskell, но было бы интересно узнать, как другие языки с сопоставлением с образцом достигают этого.

Ответы [ 3 ]

6 голосов
/ 09 июля 2011

Вы можете, несмотря на другие ответы, сделать это, используя расширение шаблонов вида в 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
2 голосов
/ 09 июля 2011

Нет, но вы можете использовать понимание списка

getFirstError xs = head [ x | Left x <- xs ]

Обратите внимание, что head не удастся, если нет ошибок.

1 голос
/ 09 июля 2011

Нет, нет. Однако вы можете легко написать функцию, используя рекурсию:

getFirstError [] = error "getFirstError: empty list or no error"
getFirstError (Left x : xs) = x
getFirstError (_ : xs) = getFirstError xs
...