Как я могу аннотировать, что мне нужен любой тип в качестве ввода, но что-то того же типа, что и вывод с помощью Flow?

Скажем, у меня есть очень простая функция, которая просто принимает аргумент любого типа и заключает его в массив.

function wrap (anything) {
  return [anything]
}

Это было бы очень легко описано в (как я понимаю) аннотации Хиндли-Милнера, например:

// wrap :: a -> [a]

Как мне использовать аннотацию типа Flow, чтобы показать то же самое, т. е. что мне нужен любой тип в качестве входных данных, и массив того же типа, что и вывод?

Не работает следующее:

function wrap (anything: a): Array<a> {
  return [anything]
}

Выдает эту ошибку:

ERROR in src/wrap.js:1
 1: function wrap(x: a): Array<a> {
                     ^ identifier `a`. Could not resolve name

person ahstro    schedule 26.10.2016    source источник


Ответы (1)


Это синтаксис для полиморфных функций:

function wrap<a>(anything: a): Array<a> {
  return [anything]
}
person vkurchatkin    schedule 26.10.2016