【发布时间】:2020-06-22 23:47:48
【问题描述】:
我只想知道我对柯里化函数的以下理解是否正确。
我想filter 列表中的所有元素> 4。我可以这样实现:
filter (>4) [1..10]
-
(>)被定义为Ord a => a -> a -> Bool,这就是为什么它不能被过滤。 -
(>4)定义为(Ord a, Num a) => a -> Bool。函数(>)现在被柯里化了,仍然需要一个参数。 - 由于 2.,
(>4)可以传递给过滤器。 - 每个传递给 filter 的 List-Element 都将传递给
(>4),并且 filter 将验证谓词并返回结果。
这对吗?
【问题讨论】:
-
这或多或少是正确的。
(>4)等价于\x -> x > 4或更规范的\x -> (>) x 4,因此您构造一个函数,如果x > 4将检查值x。 -
(>4)是中缀运算符分段:wiki.haskell.org/Section_of_an_infix_operator -
这是正确的。您可以使用 ghci 轻松验证所有涉及的类型:例如
:t (>4) (Ord a, Num a) => a -> Bool和:t (filter (>4)) (filter (>4)) :: (Ord a, Num a) => [a] -> [a] -
@MoritzSchmidt:不,
(<)是总是咖喱。您在这里所做的是执行部分应用程序。 -
@MoritzSchmidt uncurried 函数是这样调用的:
f (a1,a2,..,aN),将参数元组作为输入。相反,一个柯里化函数被称为f a1 a2 .. aN,并且可以部分应用为f a1、f a1 a2等。这与(>4)几乎无关,这是\x -> x > 4的Haskell 特殊节语法。请注意,此部分与部分应用程序((>) 4)非常不同,后者将等效于\x -> 4 > x,颠倒比较(!)
标签: haskell filter functional-programming currying