我试图让一个函数与foldr工作在一个列表上,其值为3> 4,...等,并返回True如果值列表是真实的。我试过做到目前为止:haskell中的列表上的函数返回true如果值为true
fold :: [Bool] -> Bool
fold xs = foldr (x==True) xs
where x:xs
我试图让一个函数与foldr工作在一个列表上,其值为3> 4,...等,并返回True如果值列表是真实的。我试过做到目前为止:haskell中的列表上的函数返回true如果值为true
fold :: [Bool] -> Bool
fold xs = foldr (x==True) xs
where x:xs
你想要and xs
“和”布尔值列表。等效地,foldr (&&) True xs
或all id xs
也可以工作。
回想foldr
需要函数(例如(&&)
)和基础案例(例如True
)。你的代码缺乏。
Haskell为您提供了一个令人难以置信的控制程序中发生的事情,但您必须明确地说出您想要发生的一切。特别是,如果你看一个电话foldr
:
foldr (\ x y -> ...) z xn
如果xn
是空的,这将计算为z
。否则,该值将是函数的主体(...
的值),无论如何。你想要的功能,只在一定条件下是真实的,所以你可能希望这样的表达是&&
运营商的应用:
foldr (\ x y -> ... && ...) z xn
x
是第一要素,要成为真正的价值:
foldr (\ x y -> x == True && ...) z xn
和y
意味着 '同样,对于其余元素',你也想成为真正:
foldr (\ x y -> x == True && y) z xn
您需要传入z
当没有元素时,您想要的值是什么。如果没有按照惯例没有元素,他们是“所有”真正的,所以你要True
这种情况:现在
foldr (\ x y -> x == True && y) True xn
,如果x
是一个布尔已经,x == True
只是一样x
,所以我们可以简化该表达式:
foldr (\ x y -> x && y) True xn
但Haskell有用于(\ x y -> x && y)
一个特殊的符号:(&&)
,特别是因为这是一个常见的情况:
foldr (&&) True xn
而且,因为该功能是一种常见的需要,有一个功能,它已经在标准库,称为and
:
and xn