我有一个带有两个参数的函数,我必须模式匹配。如果我在第一个模式上使用currying它将无法编译:
drop' :: Int -> [a] -> [a]
drop' 0 = id -- ghci: "Equations for drop' have different numbers of arguments"
drop' n (x:xs) = drop' (n-1) xs
编译器提供此输出:
99.hs:106:3:
Equations for drop' have different numbers of arguments
99.hs:106:3-15
99.hs:107:3-33
In an equation for `split':
split xs n
= (take' n xs, drop' n xs)
where
take' 0 _ = []
take' n (x : xs) = x : take (n - 1) xs
drop' 0 = id
drop' n (x : xs) = drop' (n - 1) xs
Failed, modules loaded: none.
但是,如果我只给出咖喱图案,那么它就会编译:
drop' :: Int -> [a] -> [a]
drop' 0 = id -- compiles
是什么给出的?
答案 0 :(得分:10)
我能找到的唯一解释(http://www.haskell.org/pipermail/haskell-cafe/2009-March/058456.html):
问题主要是语法上的,在大多数情况下都是如此 具有不同数量的参数的定义是普通的错别字。该 其他可能是实现问题:它使模式匹配规则 更复杂。
答案 1 :(得分:1)
我无法确定为什么,但这是一个已知的限制。所有相同函数的情况都必须具有相同数量的参数。
答案 2 :(得分:1)
这肯定是GHC的一个恼人的“功能”,但要修复它,你可以这样做:
drop' n = \(x:xs) -> drop' (n-1) xs
你必须同时或两者兼顾,并且两者都是相同数量的参数。如果这是一个lint检查,这很好:但我希望有一个编译器选项来打开/关闭它。