【问题标题】:Haskell currying explanation needed需要 Haskell 柯里化解释
【发布时间】:2019-01-28 12:06:27
【问题描述】:

我正在尝试理解柯里化的概念并转到Haskell documentation。但是,它说

f 是 g 的柯里化形式

然而 f 有两个参数,而 g 只有一个。由于currying是将一个接受多个参数的函数转换为一个接受一个参数并返回另一个函数的函数,'g'不应该是curried函数吗?

来自 haskell 文档

柯里化是将一个接受多个参数的函数转换为一个只接受一个参数的函数并在仍然需要任何参数时返回另一个函数的过程。

f :: a -> b -> c
is the curried form of
g :: (a, b) -> c

所以这对我来说似乎是矛盾的,我也没有看到这两个函数中的任何一个都返回一个函数。

【问题讨论】:

  • 一个接受一个 k 元组参数的函数有时被称为接受 k 个参数。这是数学中的常用术语。
  • What is 'Currying'?的可能重复

标签: haskell currying


【解决方案1】:

然而f 接受两个参数,而g 只接受一个。

不,实际上两个函数都带有一个参数。事实上,在 Haskell 中,所有函数都采用恰好一个参数。

如果你写这样的签名:

f :: a ->  b -> c

那么这是一个不太冗长的形式:

f :: a -> (b -> c)

它是如何工作的? f 是一个接受一个参数的函数,然后返回另一个再次接受一个参数的函数

以函数add :: Int -> Int -> Int为例。

如果我们写add 5 2,我们就计算5 + 2。看起来它需要两个参数,但实际上我们已经写了(add 5) 2。因此,我们以5 作为参数调用add 函数。这将返回一个函数(让我们将此函数称为add5 :: Int -> Int)。所以这个add5 函数将5 添加到一个数字上。所以如果我们再调用add5 2,那么我们得到7,因为add5返回5添加到参数。

然而,我们可以构造一个函数(如g),它接受一个二元组参数,因此我们可以使用另一种类型来传递两个值作为一个参数。事实上你可以看到g(5, 2)实际上是g (5, 2):你调用这个函数带有one参数,一个2元组(5, 2)

因此,currying 旨在将带有 one 参数(一个 2 元组)的 g 函数转换为再次采用 one 参数的函数 f,然后这将构造一个函数,该函数将采用原始 2 元组的第二个元素。

【讨论】:

    【解决方案2】:

    a -> b -> c 类型实际上是a -> (b -> c)

    所以f 不接受ab 类型的两个参数并返回c,它接受a 类型的一个参数,并返回b -> c,一个来自@ 的函数987654329@转c

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2011-04-22
      相关资源
      最近更新 更多