1

我正在尝试学习 Haskell 的基础知识,但我很难理解为什么doubleMe类型声明会导致“非法运算符”错误,而addThree根本不会导致错误?

doubleMe :: Int -> Int -> Int
doubleMe x = x + x


addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z

我感谢任何澄清。

提前谢谢了。

4

3 回答 3

5

声明需要每个参数的类型,以及结果的类型。由于doubleMe只有一个参数,因此声明应该是doubleMe :: Int -> Int.

于 2013-02-10T16:48:17.350 回答
2

您的 doubleMe 类型签名指定了两个参数。

如果您只提供一个(doubleMe x),那么右侧应该返回一个函数(Int -> Int

于 2013-02-10T16:59:24.880 回答
1

对于此类类型的问题ghci是一个很好的工具。用于:t询问表达式的类型:

Prelude> let doubleMe x = x + x
Prelude> :t doubleMe
doubleMe :: Num a => a -> a

所以类型是a -> a- 正如其他答案已经指出的那样,您只有一个论点,而不是两个论点。

你没有得到Int,因为 Haskell 试图派生最通用的类​​型签名。这就是你得到的原因Num a =>,这意味着它适用于作为类型类实例的doubleMe所有类型(在哪里定义),这反过来意味着适用于, , (至少如果你没有指定更严格的类型,比如)...aNum(+)doubleMeIntIntegerDoubleInt -> Int

于 2013-02-10T19:59:28.057 回答