haskell - 检查列表中的所有值是否具有特定的构造函数

标签 haskell algebraic-data-types

我有一个函数 myTest,它对列表中的所有元素执行构造函数检查。它看起来像这样:

data MyType = Foo Int | Bar String deriving (Show, Read)

myThing :: [MyType]
myThing = [Foo 1, Foo 2, Foo 3, Bar "fail", Foo 5]

myTest :: [MyType] -> Bool
myTest list = foldl (\ acc x -> if isOfTypeFoo x then acc else False) True list

如果列表中的每个元素都是 Foo,我希望 myTest 返回 True,但如果有一个或多个 Bar ,它返回 False。如果我运行 myTest myThing,它应该返回 False

isOfTypeFoo 函数会是什么样子? (或者有更好的方法吗?)

最佳答案

您可以从为单个 MyType 编写谓词开始:

isFoo :: MyType -> Bool
isFoo (Foo _) = True
isFoo _       = False

然后您可以使用 all 将其扩展到列表:

isAllFoo :: [MyType] -> Bool
isAllFoo = all isFoo

关于haskell - 检查列表中的所有值是否具有特定的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33930175/

相关文章:

sorting - 在 Haskell 中,如何使用内置的 sortBy 函数对对(元组)列表进行排序?

functional-programming - 代数数据类型的概念是否类似于OO语言中的类定义?

haskell - 如何将 Haskell 中的 fold 函数与其他数据类型一起使用

f# - 如何将 FParsec 结果值提取到 FSI 中的变量

Clojure 代数数据类型

haskell - 为什么 Haskell 不能对此进行优化? (在 Maybe monad 中,没有任何东西会被不必要地传播。)

haskell - F# 错误 : "Either make the arguments to ' it' explicit or, 如果您不打算将其通用,请添加类型注释。”

haskell - 从haskell中的stdin读取输入并转换为整数列表

haskell - 在 Haskell 中,为什么 Applicatives 需要在同一上下文中采用态射和数据?

haskell - Haskell中数据类型的设计