Haskell中的函数类型
我正在努力学习Haskell的基础知识,我很难理解为什么doubleMe类型声明会导致“非法运算符”错误,而addThree根本不会导致错误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只有一个参数
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;否则你会得到一个错误。