Foldr 仅应用于一个参数

Foldr applied to just one argument

所以如果数字 n 是按位应用或应用到 xs 的任何子序列的结果,我得到的函数将 return True :

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

现在我没有得到的是 foldr 给出了 (.|.)zeroBits,但我不需要另一个参数 foldr。 就像我理解 foldr 的功能一样,你将它应用到一个函数,在那种情况下是 (.|.),应用到 "starting value",我猜是 zeroBits,但是什么关于 t a,其中提到:

Prelude>:t foldr foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

有什么我遗漏的吗?顺便说一句,上面的代码可以正常工作。

foldr 带有 "missing" 参数 returns 一个接受单个参数(缺少的参数)的函数。

然后您可以继续 map 在您的 subsequences xs 上执行该函数(这意味着这些子序列中的每一个都作为 "missing" 参数传递给您的专用 foldr 函数)。

这是一个非常常见且有用的模式,允许您通过将参数子集固定为更通用的函数来创建专用函数。


在您的示例中,"specialized function" 保持匿名。如果这变得太难读了(或者这个函数在很多地方都很有用),你可以给它起一个名字。

--  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 函数视为仅采用单个参数并返回采用下一个参数的函数(反过来 returns 采用第三个参数或一个简单的结果,如果那是最后一个)。像 take 1 list 这样的表达式可以读作 (take 1) list:调用 take 1 获得一个函数,然后在 list 上调用该函数以获得最终结果。