10

我有一个带有两个参数的函数,我必须对其进行模式匹配。如果我在第一个模式上使用柯里化,它将无法编译:

  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

是什么赋予了?

4

3 回答 3

10

我能找到的唯一解释(http://www.haskell.org/pipermail/haskell-cafe/2009-March/058456.html):

这个问题主要是句法上的,因为大多数出现的具有不同数量参数的定义都是简单的拼写错误。另一个可能是实现问题:它使模式匹配规则更加复杂。

于 2013-03-24T00:03:02.187 回答
1

我不能肯定地告诉你为什么,但这是一个已知的限制。同一函数的所有情况都必须具有相同数量的参数。

于 2013-03-24T00:01:41.760 回答
1

可以肯定的是,这是 GHC 的一个令人讨厌的“功能”,但要修复它,您可以这样做:

drop' n = \(x:xs) -> drop' (n-1) xs

你必须要么都咖喱,要么都不用咖喱,而且都用相同数量的参数。如果这是一个 lint 检查,那就太好了:但我希望有一个编译器选项可以打开/关闭它。

于 2013-03-24T02:25:57.053 回答