微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

括号中的类型声明如何在 Haskell 中工作,例如 (Integer -> Integer) -> Integer

如何解决括号中的类型声明如何在 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
  • bca 相同。

写作时

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 举报,一经查实,本站将立刻删除。