我有一个函数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
会是什么样的? (或者有更好的方法吗?)
答案 0 :(得分:9)
您可以从为单个MyType
编写谓词开始:
isFoo :: MyType -> Bool
isFoo (Foo _) = True
isFoo _ = False
然后您可以使用all
将其扩展到列表:
isAllFoo :: [MyType] -> Bool
isAllFoo = all isFoo