gpt4 book ai didi

function - 在 Haskell 中,(+) 是一个函数,((+) 2) 是一个函数,((+) 2 3) 是 5。到底发生了什么?

转载 作者:行者123 更新时间:2023-12-03 23:59:27 24 4
gpt4 key购买 nike

  • 这怎么可能,那里发生了什么?
  • 有这个名字吗?
  • 还有哪些其他语言具有相同的行为?
  • 任何没有强大的打字系统?
  • 最佳答案

    如果您查看类型,则此行为非常简单直观。为了避免中缀运算符的复杂性,如 + , 我要使用函数plus反而。我还要专攻plus仅在 Int 上工作, 以减少 typeclass 线路噪声。

    假设我们有一个函数 plus , 类型为 Int -> Int -> Int .一种阅读方式是“返回 Int 的两个 Int 的函数”。但是那个符号对于那个阅读来说有点笨拙,不是吗?返回类型在任何地方都没有特别指出。为什么我们要这样写函数类型签名?因为->是右结合的,等价的类型是 Int -> (Int -> Int) .这看起来更像是在说“从 Int 到(从 IntInt 的函数)的函数”。但这两种类型实际上是完全一样的,后一种解释是理解这种行为是如何工作的关键。

    Haskell 将所有函数视为从单个参数到单个结果。您可能会想到计算结果取决于两个或多个输入的计算(例如 plus )。 Haskell 说函数 plus是一个函数,它接受单个输入,并产生一个输出,该输出是另一个函数。第二个函数接受一个输入并产生一个数字输出。因为第二个函数是由 first 计算的(并且对于第一个函数的不同输入会有所不同),“最终”输出可以取决于两个输入,因此我们可以使用这些函数实现具有多个输入的计算,这些函数只接受单个输入.

    我保证如果您查看类型,这将非常容易理解。以下是一些示例表达式,其类型已显式注释:

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

    如果某个东西是一个函数并且你将它应用到一个参数上,那么你需要做的就是从函数的类型中移除直到第一个箭头的所有东西。如果留下一个有更多箭头的类型,那么你仍然有一个函数!当您在表达式的右侧添加参数时,您会从其类型的左侧删除参数类型。类型立即清楚所有中间结果的类型,以及为什么 plus 2是一个可以进一步应用的函数(它的类型有一个箭头)和 plus 2 3不是(它的类型没有箭头)。

    “柯里化(Currying)”是将两个参数的函数转换为一个参数的函数的过程,该函数返回另一个参数的函数,该函数返回原始函数返回的任何内容。它也用于指代像 Haskell 这样的语言的属性,这些语言自动使所有功能都以这种方式工作;人们会说 Haskell“是一种柯里化(Currying)语言”或“具有柯里化(Currying)”或“具有柯里化(Currying)功能”。

    请注意,这特别优雅,因为 Haskell 的函数应用语法是简单的 token 邻接。您可以免费阅读 plus 2 3作为 plus 的应用程序到 2 个参数,或 plus 的应用至 2然后将结果应用到 3 ;你可以以最适合你当时正在做的事情的方式在心理上对其进行建模。

    在带有括号的参数列表的类 C 函数应用程序的语言中,这有点崩溃。 plus(2, 3)plus(2)(3) 非常不同,在具有这种语法的语言中, plus 的两个版本所涉及的可能有不同的类型。因此,具有这种语法的语言往往不会一直对所有函数进行柯里化(Currying),甚至不会对您喜欢的任何函数进行自动柯里化(Currying)。但这些语言在历史上也往往不具有作为一流值(value)的功能,这使得缺乏柯里化(Currying)成为一个有争议的问题。

    关于function - 在 Haskell 中,(+) 是一个函数,((+) 2) 是一个函数,((+) 2 3) 是 5。到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217874/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com