检查Haskell中的推断类型时的非类型变量参数

检查Haskell中的推断类型时的非类型变量参数,haskell,Haskell,我是哈斯克尔的新手。我自己实现了drop myDrop n xs = if n <= 0 || null xs then xs else myDrop (n - 1) (tail xs) 当您使用同一类型的两个不同参数调用函数时,不可能一个参数引发类型错误,另一个参数传递。所以这里发生了一些其他的事情 特别是, myDrop -2 [1,2,3] myDrop (-2) [1,2,3] 这不是你所期望的解释。是这样解释的 myD

我是哈斯克尔的新手。我自己实现了
drop

myDrop n xs = if n <= 0 || null xs
              then xs
              else myDrop (n - 1) (tail xs)

当您使用同一类型的两个不同参数调用函数时,不可能一个参数引发类型错误,另一个参数传递。所以这里发生了一些其他的事情

特别是,

myDrop -2 [1,2,3]
myDrop (-2) [1,2,3]
这不是你所期望的解释。是这样解释的

myDrop - (2 [1,2,3])
也就是说,用列表
[1,2,3]
作为参数从
myDrop
中减去调用的数字
2
(作为函数)。换句话说,完全是胡说八道。这就是为什么类型错误看起来很奇怪

在Haskell中,负常量需要括号:


当您使用同一类型的两个不同参数调用函数时,不可能一个参数引发类型错误,另一个参数传递。所以这里发生了一些其他的事情

特别是,

myDrop -2 [1,2,3]
myDrop (-2) [1,2,3]
这不是你所期望的解释。是这样解释的

myDrop - (2 [1,2,3])
也就是说,用列表
[1,2,3]
作为参数从
myDrop
中减去调用的数字
2
(作为函数)。换句话说,完全是胡说八道。这就是为什么类型错误看起来很奇怪

在Haskell中,负常量需要括号: