从列表中获取特定构造函数的第一个匹配项的惯用方法

mar*_*ngw 8 haskell

有没有一种很好的方法可以在列表中找到第一次出现的构造函数,而下面的示例中没有显式的递归?

data Elem = A Int | B Char deriving Show

getA :: [Elem] -> Maybe Elem
getA [] = Nothing
getA (e:es) = 
    case e of 
        A a -> Just (A a)
        _   -> getA es
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 11

只是

import Data.Maybe (listToMaybe)
getA xs = listToMaybe [e | e@(A _) <- xs]
Run Code Online (Sandbox Code Playgroud)

附录:更好,未来使用空记录模式(kudos hammar):

getA xs = listToMaybe [e | e@(A{}) <- xs]
Run Code Online (Sandbox Code Playgroud)

但请注意,这只适用于匹配构造函数.对于一般属性,find更好:

get prop xs = listToMaybe [e | e <- xs, prop e]
get prop xs = listToMaybe (filter prop xs)
get prop xs = find prop xs
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 11

你可以用Data.List.find.

getA = find isA
   where isA (A {}) = True
         isA _ = False
Run Code Online (Sandbox Code Playgroud)

  • @IonuţG.Stan:这是一个_record pattern_,没有字段绑定.它只是意味着构造函数有多少字段并不重要,所以如果你改变它,你就不必改变这个功能. (2认同)