我正在尝试学习Haskell的基础知识,并且我很难理解doubleMe
类型声明导致“非法操作员”错误的原因,而addThree
导致没有错误?< / p>
doubleMe :: Int -> Int -> Int
doubleMe x = x + x
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
我感谢任何澄清。
非常感谢提前。
答案 0 :(得分:5)
声明需要每个参数的类型,以及结果的类型。由于doubleMe
只有一个参数,因此声明应为doubleMe :: Int -> Int
。
答案 1 :(得分:2)
您的doubleMe类型签名指定了两个参数。
如果您只提供一个(doubleMe x
),则右侧应返回一个函数(Int -> Int
)
答案 2 :(得分:1)
对于此类问题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
)...