10

パターンマッチングを行う必要のある2つの引数を持つ関数があります。最初のパターンでカリー化を使用すると、コンパイルされません。

  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 ):

引数の数が異なる定義のほとんどの出現は単純なタイプミスであるという意味で、問題はほとんど構文上の問題です。もう 1 つは実装の問題である可能性があります。これにより、パターン マッチ ルールがより複雑になります。

于 2013-03-24T00:03:02.187 に答える
1

これは確かにGHCの厄介な「機能」ですが、これを修正するには、次のようにします。

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

あなたは両方またはどちらも、そして両方を同じ数の引数にカレーする必要があります。これがリントチェックの場合、それは素晴らしいことです。しかし、オン/オフを切り替えるコンパイラオプションがあればいいのにと思います。

于 2013-03-24T02:25:57.053 に答える
1

理由はわかりませんが、これは既知の制限です。同じ関数のすべてのケースは、同じ数の引数を持つ必要があります。

于 2013-03-24T00:01:41.760 に答える