haskell - 非柯里化(Currying)函数

标签 haskell currying

我无法理解柯里化(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/

相关文章:

Scala 实例 - 柯里化(Currying)问题

haskell - 如何导致 WARP 服务器终止?

haskell - 类型解构

javascript - 使用函数柯里化(Currying)在 typescript 中构建实用程序类

scala - 为什么要用带下划线的不完整参数调用柯里化(Currying)函数

r - 如何在 R 中按位置 curry ...参数?

haskell - 为什么 `forall` 需要在数据定义中具有多态类型?

haskell - 操作类型构造函数的参数顺序

haskell - 列表的排列 - Haskell

haskell - 如何在 Haskell 中定义 Lisp 的 apply?