在Haskell中,(+)是一个函数,((+)2)是一个函数,((+)2 3)为5。到底是在那里发生

2019-06-25 19:04发布

  1. 这怎么可能,这是怎么回事呢?

  2. 是否有这样的名字?

  3. 其他什么语言都有这种相同的行为?

  4. 任何不强类型系统?

Answer 1:

如果你看一下类型,这种行为是非常简单和直观。 为了避免缀运营商如并发症+ ,我要使用的功能plus来代替。 我还打算专门plus只在上班Int ,以减少类型类线路噪声。

假设我们有一个函数plus ,类型的Int -> Int -> Int 。 阅读方法之一就是“两个功能Int返回一个s Int ”。 但是,符号是,阅读有点笨拙,不是吗? 返回类型不是单挑特别的任何地方。 我们为什么会写函数类型签名这种方式? 因为->是右结合,同等类型将是Int -> (Int -> Int) 。 这看起来更像是它在说“从功能Int来(从一个功能Int到一个Int )”。 但是,这两种类型其实都是完全一样的,后者的解释是关键,理解这种行为是如何工作的。

Haskell中观看所有功能从单个参数到单个结果是。 有可能是你的计算考虑在计算的结果依赖于两个或多个输入(如plus )。 Haskell的说, 功能 plus是采用一个单一的输入的功能,并且产生一个输出,其是另一种功能 。 该第二函数有一个输入,并产生一个输出,该输出的数。 由于第二功能是通过首先计算(和将是不同的输入向第一功能不同),“最终”输出可取决于两个输入,所以我们可以实现与使用这些函数,只需要单一的输入的多个输入的计算

我答应了,这将是很容易理解,如果你看的类型。 下面是他们的类型明确标注的一些示例表达式:

plus       :: Int -> Int -> Int
plus 2     ::        Int -> Int
plus 2 3   ::               Int

如果事情是一个函数,并把它应用到的参数,以获得结果是应用程序的所有你需要做的是删除了一切,从函数的类型第一个箭头的类型。 如果离开的是有更多的箭头的类型,那么你仍然有一个功能! 当您添加参数表达的权利,你从它的类型的左侧,取出参数类型。 类型使得它立即清楚所有中间结果的类型是,为什么plus 2是可被进一步应用的功能(其类型有一个箭头)和plus 2 3没有(其类型没有箭头)。

“讨好”是打开的两个参数的函数到返回,返回无论原函数返回另一个参数的函数,一个参数的函数的过程。 它也被用来指的象Haskell语言,可以自动拥有所有功能以这种方式工作的性质; 人们会说,哈斯克尔“是咖喱语言”或“已讨好”或“已咖喱的功能”。

需要注意的是,因为Haskell的对功能应用的语法很简单令牌邻接这个工程特别优雅。 你可以自由地阅读plus 2 3作为应用plus至2个参数,或应用plus2 ,然后将结果向应用3 ; 你可以精神上模型,可以取其方式最适合你当时在做什么。

在与parenthesised参数列表类似C的功能应用的语言,这打破了一些。 plus(2, 3)是非常不同的plus(2)(3)以及与此语法语言的两个版本, plus参与很可能有不同的类型。 因此,与那种语法的语言往往不具备所有的功能被令行禁止所有的时间,甚至有你喜欢的任何功能的自动柯里。 但是,这样的语言在历史上也往往不具备的功能作为第一类值,这使得缺乏讨好一个有争议的问题的。



Answer 2:

在Haskell, 所有的功能采取完全1个输入,并产生完全1输出 。 有时,输入到或输出的功能的可以是另一功能。 输入到或输出的功能的也可以是一个元组。 您可以模拟通过以下两种方式之一多个输入的功能:

  • 使用元组作为输入
    (in1, in2) -> out

  • 使用函数作为输出*
    in1 -> (in2 -> out)

同样,你可以模拟在以下两种方式之一多个输出的功能:

  • 使用元组作为输出*
    in -> (out1, out2)

  • 使用函数“第二输入”(一拉函数作为输出)
    in -> ((out1 -> (out2 -> a)) -> a)

*这种方式通常是通过Haskellers青睐

(+)功能模拟生产的函数作为输出的典型的Haskell方式服用2个输入。 (专业以Int为便于沟通:)
(+) :: Int -> (Int -> Int)

为了方便起见, ->是右结合的,所以对于类型签名(+)也可写成
(+) :: Int -> Int -> Int


(+)是一个函数,它在一个数字,并从数产生另一种功能,以数。

(+) 5是施加的结果(+)到参数5 ,因此,它是从数编号的函数。

(5 +)是另一种方式来写(+) 5

2 + 3是写作的另一种方式(+) 2 3 。 功能应用程序是左结合的,所以这是书写的另一种方式(((+) 2) 3) 换句话说:应用功能(+)到输入2 。 其结果将是一个功能。 采取这一功能,并将其应用到输入3结果是一个数字。

因此, (+)是一个函数, (5 +)是一个函数,和(+) 2 3是一个数字。



Answer 3:

在Haskell中,你可以采取的两个参数的函数,它适用于一个参数,并得到一个参数的函数。 其实,严格来说,+不是两个参数的函数,它返回一个参数的函数,一个参数的函数。



Answer 4:

  1. 通俗地说,在+是实际功能和它正在等待接收一定数量的参数 (在这种情况下,2以上),直到它返回。 如果你不给它两个或更多的参数,那么它仍将等待另一个参数的函数。
  2. 这就是所谓的柯里
  3. 函数式语言的地段(Scala中,计划等)
  4. 大多数函数式语言是强类型的 ,但是这到底是一件好事,因为它减少了错误,这在企业或关键系统运行良好。

作为一个侧面说明,Haskell是哈斯克尔库里,在组合的逻辑工作时,谁重新发现功能柯里的现象而得名的语言。



Answer 5:

比如Haskell或者Ocaml语言有particularily适合于讨好语法,但你可以做到这一点与动态类型其他语言,如方案钻营 。



文章来源: In Haskell, (+) is a function, ((+) 2) is a function, ((+) 2 3) is 5. What exactly is going on there?