因此,如果数字n是按位或应用xs的任何子序列的结果,我将获得将返回True
的函数:
checkBits xs n = not $ null $ filter (==n) $ map (foldr (.|.) zeroBits) (subsequences xs)
现在我不明白的是,foldr
被赋予了(.|.)
和zeroBits
,但我没有需要{{1}的另一个论点}。
就像我理解foldr
的功能一样,你将它应用到一个函数(在这种情况下是foldr
)到一个"起始值",我猜是{{1}但是,(.|.)
怎么样,在下面提到:
zeroBits
我有什么遗失的吗?顺便说一下上面的代码就像它应该的那样。
答案 0 :(得分:1)
foldr
"缺少"参数返回一个带有单个参数的函数(缺少的参数)。
然后,您可以继续执行map
上subsequences xs
的功能(意味着每个子序列都会作为&#34;缺少&#34;参数传递给您的专用foldr函数)。< / p>
这是一种非常常见且有用的模式,允许您通过将参数子集固定到更通用的函数来创建专用函数。
在你的例子中,&#34;专门的功能&#34;仍然是匿名的。如果它变得难以阅读(或者该功能在很多地方都很有用),你可以给它起一个名字。
-- create a new function that takes the first ten list elements
top10 = take 10 -- call take with a "missing parameter"
-- as opposed to
ten = take 10 myList -- call take with all parameters to get a list
将Haskell函数视为只接受一个参数并返回一个接受下一个参数的函数(它会返回一个接受第三个参数的函数或者一个简单的结果,如果是那个),可能有助于(或混淆)Haskell函数最后一个)。然后可以将take 1 list
之类的表达式读作(take 1) list
:调用take 1
以获取函数,然后在list
上调用该函数以获得最终结果。