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

Haskell 检查列表中的所有值都有一个特定的构造函数,haskell,algebraic-data-types,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

我有一个函数
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,但如果有一个或多个
,则返回False。如果我运行
mytestmything
,它应该返回
False


函数
isOfTypeFoo
看起来像什么?(或者有更好的方法吗?

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

isFoo :: MyType -> Bool
isFoo (Foo _) = True
isFoo _       = False
然后,您可以使用以下方法将其扩展到列表:


你认为isOfTypeFoo的类型是什么?而且,这个名字用词不当,因为
foox
的类型是
MyType
。该函数应该真正命名为
isFoo
或类似名称。您可以使用
lambdase
很好地编写所需函数:
\case{Foo}->True;\u->False}
,当然可以使用
foldl
,也可以编写
所有$\case{Foo}->True;\u->False}
@user2407038,
foldl
在这里不合适
foldr
很有意义,或者,正如您所提到的,
all
@dFeur为什么foldr比foldl好?@MarkKaravan,
foldr
允许短路
foldl
没有。@MarkKaravan,这里没有类型检查。Haskell类型在编译时被删除。您应该停止将运行时发生的事情视为检查类型,而开始将其视为构造函数上的匹配。@MarkKaravan:在C术语中,您实际上拥有
union MyType{int tag;struct{int tag;int*value;}as_foo;struct{int tag;string*value;}as_bar;}
和{fooy->…}的案例x只是说
如果(x.tag==Foo_-tag){y=x.as_-Foo.value;…}
isAllFoo :: [MyType] -> Bool
isAllFoo = all isFoo