我正在通过Haskell book工作,我有点难以理解折叠。一个练习要求读者用elem
编写foldr
函数。我无法绕过它并用谷歌搜索一个例子,我现在试图理解这个例子。 foldr
的类型签名是:
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
我找到的示例函数是:
myElem' :: Eq a => a -> [a] -> Bool
myElem' a = foldr (\x y -> a == x || y) False
我的理解是,(\x y -> a == x || y)
正在履行该类型的(a -> b -> b)
部分,False
正在履行b
,而t a
正在被隐含在免费中风格。
但是lambda本身就像现在一样神奇。我将其作为函数x读取,带有一个参数y将检查x(y) == a
是否为myElem'
作为参数提供的元素,并返回True或原始参数为{{ 1}}。这显然是胡说八道。我哪里错了?
答案 0 :(得分:3)
\x y -> a == x || y
是一个包含两个参数的函数,名为x
和y
。只要True
为a == x
或True
为y
,它就会返回True
。