检查列表中的所有值都有一个特定的构造函数

时间:2015-11-26 03:38:05

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

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

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

1 个答案:

答案 0 :(得分:9)

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

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

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

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