Arhn - архитектура программирования

Ошибка: имя «E» не является типом, поэтому его нельзя использовать в качестве аргумента типа. Почему и как создать универсальную функцию?

Я пытаюсь создать функцию верхнего уровня:

Iterable<E> mapEnumerated<T>(Iterable<T> iterable, E Function<E>(int, T) fn) sync* {
  var index = 0;
  for (final item in iterable) {
    yield fn(index++, item);
  }
}

Но он сообщает об ошибке: The name 'E' isn't a type so it can't be used as a type argument..

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

Iterable mapEnumerated<T>(Iterable<T> iterable, E Function<E>(int, T) fn) sync* {
  var index = 0;
  for (final item in iterable) {
    yield fn(index++, item);
  }
}


void main() {
  List<String> strs = mapEnumerated([5, 6, 7], 
    (i, e) => (i + e).toString()
  ).toList();

  print(strs);
}

Это сообщит об ошибке: The argument type '(dynamic, dynamic) → String' can't be assigned to the parameter type '<E>(int, int) → E'.

Может ли кто-нибудь сказать мне, как правильно это реализовать?

Следующий код работает, но это совсем не универсальная функция:

Iterable<String> mapEnumerated(Iterable<int> iterable, String Function(int, int) fn) sync* {
  var index = 0;
  for (final item in iterable) {
    yield fn(index++, item);
  }
}


void main() {
  List<String> strs = mapEnumerated([5, 6, 7], 
    (i, e) => (i + e).toString()
  ).toList();

  print(strs);
}

Большое спасибо.

Ссылка: исходный код взят с https://github.com/dart-lang/sdk/issues/32467. Я просто не уверен, как реализовать это как общую функцию.

12.05.2019

  • Моим первым побуждением было изменить mapEnumerated<T> на mapEnumerated<E, T>, но это тоже не помогло. E будучи String не хочет применяться к типу параметра функции. Надеюсь, что кто-то с более глубоким пониманием дженериков Dart сможет пролить больше света. 12.05.2019
  • @GazihanAlankus спасибо за ответ. Код взят с сайта github.com/dart-lang/sdk/issues/32467. Я просто не знаю, как его использовать. 12.05.2019

Ответы:


1

Переменная типа E представлена ​​только в типе функции аргумента fn, поэтому вне его она недоступна.

Функция fn здесь объявлена ​​как принимающая универсальную функцию, поэтому вы не сможете вызвать ее с помощью (i, e) => (i + e).toString), потому что эта функция сама по себе не является универсальной.

Вы можете переписать свою функцию как:

Iterable<E> mapEnumerated<T, E>(Iterable<T> iterable, E Function(int, T) fn) sync* {
  var index = 0;
  for (final item in iterable) {
    yield fn(index++, item);
  }
}

Это вводит переменную типа E в функцию mapEnumerated, поэтому ее можно использовать в возвращаемом типе этой функции.

13.05.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..