我开始学习Haskell,并尝试指定一个具有Int类型的任意零阶函数的Haskell类型签名。就我所知,对于一阶函数,它应该类似于 k :: Int -> Int
。那么零阶函数的类型签名是否只是 k :: Int
,或者这样假设是错误的?谢谢!
我开始学习Haskell,并尝试指定一个具有Int类型的任意零阶函数的Haskell类型签名。就我所知,对于一阶函数,它应该类似于 k :: Int -> Int
。那么零阶函数的类型签名是否只是 k :: Int
,或者这样假设是错误的?谢谢!
k :: Int
不是一个函数;它只是一个Int 。
在Haskell中最接近具有0个参数的函数是一种类型为() -> a 的函数,其中a是某种类型。因为只有一种类型()的值,所以只有一种调用该函数的方法:使用()。
k :: () -> Int
k () = 3
(您可能会注意到,对于类型为 a
的每个值,恰好有一个类型为 () -> a
的函数;这是一些理论上的重要性问题,但它并不真正与此处的问题相关。)
->
类型的构造器是二元的,因此从技术上讲,函数具有一个参数和一个返回类型,但我认为在谈论和思考 Haskell 时也很有用,可以使用缩写“带有两个参数的函数”来统一表示类型如a -> (b -> c)
。显然,继续推广 arity 以计算箭头类型右侧需要多少次才能到达非箭头类型,这样 a -> (b -> c)
具有 arity 2,Bool -> Bool -> Bool -> Bool
具有 arity 3,而 Int
具有 arity 0。这样定义没有问题。Bool -> Bool
具有顺序 1,(a -> b) -> [a] -> [b]
具有顺序 2(并且 arity 为 2),((Int -> r) -> r) -> Cont r Int
具有顺序 3…在允许自己这种灵活性的世界中,我认为自然地将 Int
视为顺序-0,arity-0 的函数是 非常自然的。(实际上,可以推导出所有顺序-0 函数都具有 arity-0。)a -> a
的顺序取决于如何实例化 a
。 - Iceland_jackid
不能将其参数用作函数,这正是因为它是多态的。因此,我们从它的类型中知道它不能“做高阶事情”,这在某种程度上证明了简单地说它不是高阶的是有道理的。 - BenA->B
的东西”。我宁愿将元数的概念推广到非函数事物上,以便说“Int
的元数为零”,而不是说“Int
是一个元数为零的函数”。我仍然希望有一个词来表示可以应用于参数以计算某些东西的事物。如果“函数”被重新定义为包括元数为零的值,则它将包括所有 Haskell 值,而我们已经有一个词来表示这个:值。 - Ben
(&&)
是一种奇特的对象、一种高阶函数吗? - Daniel Wagnert1 -> t2 -> t3
不属于(t1 -> t2) -> t3
的形式,而高阶函数则是类型为(t1 -> t2) -> t3
的值。在数学中,通常会以“X是Y”的形式定义一个概念,而不需要列出X不是的所有情况。 - Daniel Wagnerf : A × B → C
在f(a, —) : B → C
中是部分应用的,而g : A → C^B
是完全应用的,以g a : C^B
形式(“分配”一个闭包)。在 Haskell 中它们都被称为(->)
。 - Jon Purdy