TL;DR: Если у вас возникла похожая проблема, сначала проверьте, не сделали ли вы что-то совершенно глупое, например, перепутали : с =. Я был так сбит с толку сообщением об ошибке, что мне удалось воспроизвести глупую ошибку еще одной глупой ошибкой, так что смейтесь от души:
Я столкнулся с проблемой, когда я боролся с ошибкой 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 и NotComparable. Поэтому я ожидал, что cmpByKey[K,V] будет конкретным cmpByKey[int,NotComparable]. Есть ли синтаксический трюк, чтобы сделать компаратор конкретным?
Если это невозможно, каковы возможные обходные пути здесь? Может не только конкретно в этом примере, а вообще? Я предполагаю, что эта проблема возникает каждый раз, когда общий процесс должен передать другой процесс, который включает общий тип?
system.cmp, моя переданная функция игнорируется (хотя не может воспроизводиться тривиально). Может быть, это причина, по которойsortне имеет значения по умолчанию дляcmpв первую очередь? 20.05.2015