Foldr仅应用于一个参数

时间:2017-07-19 07:08:48

标签: haskell fold

因此,如果数字n是按位或应用xs的任何子序列的结果,我将获得将返回True的函数:

checkBits xs n = not $ null $ filter (==n) $ map (foldr (.|.) zeroBits) (subsequences xs)

现在我不明白的是,foldr被赋予了(.|.)zeroBits,但我没有需要{{1}的另一个论点}。 就像我理解foldr的功能一样,你将它应用到一个函数(在这种情况下是foldr)到一个"起始值",我猜是{{1}但是,(.|.)怎么样,在下面提到:

zeroBits

我有什么遗失的吗?顺便说一下上面的代码就像它应该的那样。

1 个答案:

答案 0 :(得分:1)

foldr"缺少"参数返回一个带有单个参数的函数(缺少的参数)。

然后,您可以继续执行mapsubsequences 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上调用该函数以获得最终结果。