Почему процедура с явно указанными универсальными типами не работает?

#nim-lang

#nim-lang

Вопрос:

Если типы для map указаны явно, пример не будет компилироваться, почему?

Это работает

 import sequtils

let nlist = @[1, 2]
let slist: seq[string] = nlist.map(proc (v: auto): auto = $v)
  

Но это не:

 let slist: seq[string] = nlist.map[int, string](proc (v: auto): auto = $v)
  

Комментарии:

1. ошибка, которую вы получаете ( Error: type mismatch ... expression: map(nlist) я думаю, это связано с тем, что UFC не может видеть параметр op, как только вы определяете общий. Я нахожу более странным, что если вы попытаетесь с let slist: seq[string] = map[int, string](nlist, (proc (v: auto): auto = $v)) , сообщение об ошибке будет Error: A nested proc can have generic parameters only when it is used as an operand to another routine and the types of the generic paramers can be inferred from the expected signature.

Ответ №1:

Помните, что map — это просто обычная процедура, которая принимает два параметра, и вы можете использовать ее как first.map(second) из-за синтаксиса вызова метода, но есть некоторые ограничения. На самом деле, если вы напишете этот код как обычный вызов proc:

 import sequtils

let nlist = @[1, 2]
let slist: seq[string] = map[int, string](nlist, proc (v: auto): auto = $v)
  

Тогда компилятор больше не запутывается в синтаксисе и выдает вам надлежащую причину:

Ошибка: вложенный процесс может иметь универсальные параметры только тогда, когда он используется в качестве операнда для другой процедуры, и типы универсальных параметров могут быть выведены из ожидаемой подписи.