我已经开始学习 Haskell,并尝试用 Int 类型指定任意零阶函数的 Haskell 类型签名。据我了解,对于一阶函数,它会类似于k :: Int -> Int. 这是否意味着零阶函数的类型签名只是k :: Int,或者这样的假设是错误的吗?先感谢您!
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 和理解 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。)
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |