Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的函数类型_Haskell - Fatal编程技术网

Haskell中的函数类型

Haskell中的函数类型,haskell,Haskell,我正在努力学习Haskell的基础知识,我很难理解为什么doubleMe类型声明会导致“非法运算符”错误,而addThree根本不会导致错误 doubleMe :: Int -> Int -> Int doubleMe x = x + x addThree :: Int -> Int -> Int -> Int addThree x y z = x + y + z 我感谢任何澄清 非常感谢。声明需要每个参数的类型以及结果的类型。因为doubleMe只有一个参数

我正在努力学习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::Int->Int。

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


如果只提供一个as is doubleMe x,则右侧应返回函数Int->Int

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

如果您只提供一个as is doubleMe x,那么对于此类类型的问题,右侧应该返回函数Int->Int

,ghci是一个很好的工具。使用:t询问表达式的类型:

Prelude> let doubleMe x = x + x
Prelude> :t doubleMe
doubleMe :: Num a => a -> a
所以类型是a->a-你只有一个参数,而不是两个,正如其他答案已经指出的那样

因为Haskell试图派生最通用的类型签名,所以不能得到Int。这就是为什么取而代之的是Num a=>的原因,这意味着doubleMe将适用于所有类型a,这些类型是定义了+的Num type类的实例,这反过来意味着doubleMe适用于Int、Integer、Double,至少如果您不指定更严格的类型,如Int->Int

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

Prelude> let doubleMe x = x + x
Prelude> :t doubleMe
doubleMe :: Num a => a -> a
所以类型是a->a-你只有一个参数,而不是两个,正如其他答案已经指出的那样


因为Haskell试图派生最通用的类型签名,所以不能得到Int。这就是为什么取而代之的是Num a=>的原因,这意味着doubleMe将适用于所有类型a,这些类型是定义了+的Num type类的实例,这反过来意味着doubleMe适用于Int、Integer、Double,至少如果您不指定更严格的类型,如Int->Int

哦!!我懂了。因此,如果我在做doubleMe x=x+x+x+y,类型声明将是doubleMe::Int->Int->Int???是的,但您也必须在=的左侧添加y;否则你会出错的。哦!我懂了。因此,如果我在做doubleMe x=x+x+x+y,类型声明将是doubleMe::Int->Int->Int???是的,但您也必须在=的左侧添加y;否则你会得到一个错误。