Haskell中的函数类型

时间:2013-02-10 16:44:18

标签: haskell

我正在尝试学习Haskell的基础知识,并且我很难理解doubleMe类型声明导致“非法操作员”错误的原因,而addThree导致没有错误?< / p>

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


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

我感谢任何澄清。

非常感谢提前。

3 个答案:

答案 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适用于IntIntegerDouble(至少如果您没有指定更具限制性的类型,例如Int -> Int )...