1

TL;DR: 同様の問題がある場合は、 a:と a を混同するなど、完全にばかげたことをしていないことを最初に確認してください=。私はエラーメッセージに非常に困惑していたので、愚かな間違いをさらに別の愚かな間違いで再現することができたので、大笑いしてください:

エラーに苦しんでいたところに問題が発生しましたno generic parameters allowed。この問題はおそらく次のように簡略化して説明するのが最も適切です: 最初の要素だけでタプルを比較する問題。次の例を検討してください。

import algorithm

# just a dummy type emphasizing that it should not be
# used for the comparison
type
  NotComparable = object

# generic proc to compare a tuple by the first element
proc cmpByKey[K,V](x: (K,V), y: (K,V)): int = 
  system.cmp(x[0], y[0])

# now the actual challenge: how to write a function which
# takes some collection of tuples and defines a local
# key comparator for the given tuple.
proc sortByFirstTupleElement[K,V](data: seq[(K,V)]) =
  let compare = cmpByKey[K,V]
  sort[(K,V)](cmp: compare)

let data = @[(2, NotComparable()),
             (1, NotComparable()),
             (3, NotComparable())]

sortByFirstTupleElement[int, NotComparable](data)

この例では が生成されError: no generic parameters allowed for sortます。ネストされたコンパレータ プロシージャも定義して、あらゆる種類の構文のバリエーションを試しました。私が理解していないこと: コンパレーターがまだ一般的であると見なされているのはなぜですか? sortByFirstTupleElement私は、型内でKVが呼び出しコンテキストからインスタンス化された型、つまりintandであることを期待していましたNotComparable。したがって、私cmpByKey[K,V]は具体的であることを期待していましたcmpByKey[int,NotComparable]。コンパレータを具体的にするための構文上のトリックはありますか?

これが不可能な場合、ここで可能な回避策は何ですか? この例だけでなく、一般的には?この問題は、ジェネリック proc がジェネリック型を含む別の proc を渡す必要があるたびに発生すると思いますか?

4

1 に答える 1

4

あなたの問題はsort、間違ったパラメーターで呼び出していることです。dataパラメーターを sort に渡さdataず、var パラメーターではないため、可変ではありません。また、cmp名前付きパラメーターではないため、比較関数を直接渡すだけです。例えば:

import algorithm

# just a dummy type emphasizing that it should not be
# used for the comparison
type
  NotComparable = object

# generic proc to compare a tuple by the first element
proc cmpByKey[K,V](x: (K,V), y: (K,V)): int = 
  system.cmp(x[0], y[0])

# now the actual challenge: how to write a function which
# takes some collection of tuples and defines a local
# key comparator for the given tuple.
proc sortByFirstTupleElement[K,V](data: var seq[(K,V)]) =
  let compare = cmpByKey[K,V]
  data.sort(compare)

var data = @[(2, NotComparable()),
             (1, NotComparable()),
             (3, NotComparable())]

sortByFirstTupleElement(data)

また、let compare = ...は余分です。直接電話できますdata.sort(cmpByKey[K,V])

cmp: compare名前付きパラメーター構文 ( ) ではなくオブジェクト コンストラクター構文 ( ) を使用しているため、エラー メッセージが表示されます。これにより、Nimは、 というプロシージャではなく、cmp = compare呼び出されたオブジェクト タイプを検索します。エラー メッセージはまだ少しわかりにくいですが、それが原因です。sortsort

于 2015-05-20T17:49:26.473 に答える