haskell - 从列表中获取特定构造函数的第一次出现的惯用方法

标签 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

最佳答案

简单地

import Data.Maybe (listToMaybe)
getA xs = listToMaybe [e | e@(A _) <- xs]

附录:更好,使用空记录模式(kudos hammar)面向 future :
getA xs = listToMaybe [e | e@(A{}) <- xs]

但是请注意,这只适用于匹配的构造函数。对于一般属性,find更好:
get prop xs = listToMaybe [e | e <- xs, prop e]
get prop xs = listToMaybe (filter prop xs)
get prop xs = find prop xs

关于haskell - 从列表中获取特定构造函数的第一次出现的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8195145/

相关文章:

exception - 我的并发 monad 是 MonadThrow 的有效实例吗?

haskell - 为什么 ($ 3) 有签名 (a -> b) -> b?

haskell - 使用 `at` 和 `ix` 组合镜头

haskell - 需要为 Yesod 路径定义哪些类型类?

haskell - 无法将预期类型 `HandlerT...' 与实际类型 `IO String' 匹配

haskell - mzero如何匹配守卫类型签名?

haskell - 如何为 GHCi 设置程序的命令行参数?

haskell - 为什么 ghci 在这种情况下不提供预期的模糊类型变量错误?

haskell - 如何将本地版本的库与 cabal 链接

haskell - 如何在 Haskell 项目中使用 DLL?