像
这样的定义mergeLists :: Ord a => [a] -> [a] -> [a]
mergeLists [] = id
mergeLists l [] = l
mergeLists (x:xs) (y:ys) = if y < x
then y : mergeLists (x:xs) ys
else x : mergeLists xs (y:ys)
导致错误
MergeLists.hs:3:1: error:
Equations for ‘mergeLists’ have different numbers of arguments
MergeLists.hs:3:1-18
MergeLists.hs:4:1-19
|
3 | mergeLists [] = id
| ^^^^^^^^^^^^^^^^^^...
如果有问题的行被重写为mergeLists [] l = l
,则错误消失。
Haskell是否禁止在单个函数定义中混合使用无点和非自由子句?
答案 0 :(得分:4)
通过此方法在Haskell中定义函数时,每个声明必须具有相同数量的参数。这是出于涉及可能的拼写错误的原因,以及更容易的模式匹配。
由于您的第一行只包含一个参数[]
,因此所有其他定义都包含两个参数,因此会导致错误。
这是禁止在这种特殊情况下混合尖头和无点样式,是的,但似乎是为了避免提到的拼写错误。