我无法理解柯里化(Currying)和非柯里化(Currying)函数。我在 Google 上尝试为我提供定义的所有网站都不清楚。
在一个例子中,我发现他们这么说
max 4 5
与 (max 4) 5
但我不明白他们在做什么。当 max 需要 2 个参数时,如何拥有一个函数 (max 4)
?我完全迷失了。
最佳答案
Haskell 的技巧是函数只接受一个参数。这看起来很疯狂,但确实有效。
haskell 函数:
foo :: Int -> Int -> Int
foo a b = a + b
真正的意思是:一个函数接受 1 个参数,然后返回另一个接受一个参数的函数。这称为柯里化(Currying)。
所以使用它,我们真的可以像这样编写这个函数定义:
foo :: Int -> (Int -> Int) --In math speak: right associative
和意思完全一样。
这实际上非常有用,因为我们现在可以编写简洁的代码,例如:
foo1 :: Int -> Int
foo1 = foo 1
由于 Haskell 中的函数应用只是空格,所以大多数时候你可以假装柯里化(Currying)函数没有柯里化(Currying)(接受多个参数并只返回一个结果)。
如果你真的真的需要非柯里化(Currying)函数:使用元组。
uncFoo :: (Int, Int) -> Int
uncFoo (a, b) = a + b
编辑
好的,要了解部分应用程序发生了什么,请考虑 bar
bar a b c = [a, b, c]
问题是,编译器会对您刚刚输入 lambda 的内容进行脱糖处理,如下所示
bar = \a ->
\b ->
\c ->
[a, b, c]
这利用了闭包(每个内部函数都可以“记住”前一个函数的参数。
因此,当我们说 bar 1
时,编译器会查看 bar
并查看最外层的 lambda,并应用它给出
bar 1 = \b ->
\c ->
[1, b, c]
如果我们说bar 1 2
bar 1 2 = \c ->
[1, 2, c]
如果我说“申请”时的意思很模糊,那么了解我的真正意思可能会有所帮助 beta reduction来自 lambda 演算。
关于haskell - 非柯里化(Currying)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15539450/