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