我正在尝试学习 Haskell 的基础知识,但我很难理解为什么doubleMe
类型声明会导致“非法运算符”错误,而addThree
根本不会导致错误?
doubleMe :: Int -> Int -> Int
doubleMe x = x + x
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
我感谢任何澄清。
提前谢谢了。
我正在尝试学习 Haskell 的基础知识,但我很难理解为什么doubleMe
类型声明会导致“非法运算符”错误,而addThree
根本不会导致错误?
doubleMe :: Int -> Int -> Int
doubleMe x = x + x
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
我感谢任何澄清。
提前谢谢了。
声明需要每个参数的类型,以及结果的类型。由于doubleMe
只有一个参数,因此声明应该是doubleMe :: Int -> Int
.
您的 doubleMe 类型签名指定了两个参数。
如果您只提供一个(doubleMe x
),那么右侧应该返回一个函数(Int -> Int
)
对于此类类型的问题ghci
是一个很好的工具。用于:t
询问表达式的类型:
Prelude> let doubleMe x = x + x
Prelude> :t doubleMe
doubleMe :: Num a => a -> a
所以类型是a -> a
- 正如其他答案已经指出的那样,您只有一个论点,而不是两个论点。
你没有得到Int
,因为 Haskell 试图派生最通用的类型签名。这就是你得到的原因Num a =>
,这意味着它适用于作为类型类实例的doubleMe
所有类型(在哪里定义),这反过来意味着适用于, , (至少如果你没有指定更严格的类型,比如)...a
Num
(+)
doubleMe
Int
Integer
Double
Int -> Int