如何解决括号中的类型声明如何在 Haskell 中工作,例如 (Integer -> Integer) -> Integer
我是 Haskell 和编程的初学者。我正在学习如何根据类型声明编写函数。如何编写在括号中声明类型的函数,如 (a -> b) -> b。
当我尝试这个时:
z :: (Integer -> Integer) -> Integer
z x y = x + y
我收到了这样的错误:
• Couldn't match expected type ‘Integer’
with actual type ‘(Integer -> Integer) -> Integer -> Integer’
• The equation(s) for ‘z’ have two arguments,but its type ‘(Integer -> Integer) -> Integer’ has only one
如果我只给一个分配给整数的参数,它会进行类型检查,
z f = 9
但不知道如何使用该函数,因为它在我输入 z 9 时显示错误:
• No instance for (Num (Integer -> Integer))
arising from the literal ‘5’
(maybe you haven't applied a function to enough arguments?)
• In the first argument of ‘z’,namely ‘5’
In the expression: z 5
In an equation for ‘it’: it = z 5
如何为此类类型声明编写适当的函数以及它们如何工作?
解决方法
z :: (a -> b) -> c
是一个函数的签名,它接受一个 a -> b
并返回一个 c
;而 a -> b
又是一个接受 a
并返回 b
的函数。
定义
z x y = x + y
与该类型不兼容。后一个函数确实有签名
z :: Num a => a -> a -> a
你可以认为和下面的一样
z :: a -> b -> c
在定义中使用 +
的作用是要求
-
a
成为Num
, - 和
b
和c
与a
相同。
写作时
z :: (Integer -> Integer) -> Integer
z f = 9
您正在定义一个函数 z
,它接受一个函数 Integer -> Integer
,根本不使用它,无论如何都返回 9
。
所以你可以调用z (+3)
,即将函数“plus 3”传递给z
,你就会退出9
。
事实上,每当您向 9
提供可被视为 z
的东西时,您都会得到 Integer -> Integer
。这对于 z (+3)
、z (subtract 9)
等显然是正确的,但对于 z undefined
也是如此,因为 undefined
的类型为 undefined :: a
,即它可以取任何类型的地方,包括 Integer -> Integer
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。