Haskell 中的零阶函数

And*_*ger 4 haskell

我已经开始学习 Haskell,并尝试用 Int 类型指定任意零阶函数的 Haskell 类型签名。据我了解,对于一阶函数,它会类似于k :: Int -> Int. 这是否意味着零阶函数的类型签名只是k :: Int,或者这样的假设是错误的吗?先感谢您!

che*_*ner 5

Haskell 中没有“零阶”函数。Haskell 中的每个函数的元数均为1:每个函数接受一个参数,并返回一个值。返回值本身可以是另一个函数。(高阶函数是指其参数和/或返回类型本身就是函数类型的函数。)

k :: Int不是一个函数;这只是一个Int.

Haskell 中与 arity 0 函数最接近的是() -> a某种 type的 type 函数a。因为 type 的值只有一个(),所以调用该函数的方法只有一种: with ()

k :: () -> Int
k () = 3
Run Code Online (Sandbox Code Playgroud)

() -> a(您可能会注意到,对于 type 的每个值,都有一个 type 函数a;这具有一定的理论重要性,但与此处的问题并不真正相关。)

  • 这是“高阶”的历史数学定义,但这并不是我们现在在 Haskell 中实际使用它的方式,在 Haskell 中柯里化是常态。非正式地,如果一个函数与 *n* 阶函数同构,我们将其称为“*n*阶”;同上*n*-ary。这些差异在类别领域中是相关的:通过笛卡尔闭包,您可以将“函数”箭头内化为“闭包”对象(指数)。函数“f : A × B → C”*部分*应用于“f(a, —) : B → C”,而“g : A → C^B”*完全*应用于“ga : C^” B`(“分配”一个闭包)。在 Haskell 中,它们都被称为“(->)”。 (5认同)
  • 返回类型本身就是函数的函数不是高阶函数。 (3认同)
  • 哇。虽然我现在同意多个地方都同意这个定义,但我的*天哪*与我想象的相比,它是一个无用的定义。你会告诉我有人认为 `(&&)` 是一些奇异的对象,一个高阶函数? (3认同)

Dan*_*ner 5

有一系列信念以“Haskell 中的每个函数都有一个参数”开始。这些信念很有:它们构成了谈论 Haskell 和理解 Haskell 行为的非常精确的方式的基础。

但他们总是有点太刺耳了,不符合我的口味。尽管->类型形成者是二元的,因此从技术上讲,一个函数有一个参数和一个返回类型,但我认为,拥有一种谈论和思考 Haskell 的速记法也是有用的,它允许你在精神上和口头上对类型进行分块,a -> (b -> c)例如“具有两个参数的函数”。元数的明显概括是计算在到达非箭头类型之前必须转到箭头右侧的次数,因此a -> (b -> c)元数为 2,Bool -> Bool -> Bool -> Bool元数为 3,Int元数为 0。没有这样的定义有问题。

如果你允许自己有这种灵活性,那么你也可以更灵活地谈论顺序,这样“顺序”的自然概括就是计算在你被迫触底之前,你可以走到箭头左边多少次。非箭头类型。因此,Bool -> Bool阶数为 1,(a -> b) -> [a] -> [b]阶数为 2(数量为 2),((Int -> r) -> r) -> Cont r Int阶数为 3……在您允许自己具有灵活性的世界中,我认为谈论阶数为 0,数量为是非常自然的Int0 功能。(事实上​​,我们可以推导出所有 0 阶函数的元数都是 0。)

  • @Iceland_jack是的,在存在多态性的情况下必须小心。不过,这并不是不可克服的。对于大多数目的,只需采用简单的方法并将变量视为不是函数就可以了。 (2认同)