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