为什么我可以在模式匹配中讨论其中一种模式而不是另一种模式?

时间:2013-03-23 23:48:41

标签: haskell pattern-matching currying

我有一个带有两个参数的函数,我必须模式匹配。如果我在第一个模式上使用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

是什么给出的?

3 个答案:

答案 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检查,这很好:但我希望有一个编译器选项来打开/关闭它。