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
私は、型内でK
とV
が呼び出しコンテキストからインスタンス化された型、つまりint
andであることを期待していましたNotComparable
。したがって、私cmpByKey[K,V]
は具体的であることを期待していましたcmpByKey[int,NotComparable]
。コンパレータを具体的にするための構文上のトリックはありますか?
これが不可能な場合、ここで可能な回避策は何ですか? この例だけでなく、一般的には?この問題は、ジェネリック proc がジェネリック型を含む別の proc を渡す必要があるたびに発生すると思いますか?