Понимание этого сигнального кода

Со вчерашнего дня я читаю этот фрагмент кода и пытаюсь найти разумное объяснение. Не могли бы вы проверить правильность моих предположений.

Этот код приходит отсюда.

port requests : Signal (Task x ())
port requests =
  Signal.map lookupZipCode query.signal
    |> Signal.map (\task -> Task.toResult task `andThen` Signal.send results.address)

Строка 1 определяет порт, возвращает Signal который состоит из Taskтип, обозначенный x и пустое значение (это не имеет смысла для меня, и я полагаю, что это неправильно).

В строках 4 и 5 используется конструкция приложения функции forward, поэтому результат строки 4 передается в качестве аргумента в строку 5, но что происходит в деталях в этих строках?

Чтобы узнать о функциональном реактивном программировании, я прохожу этот пост. Это хороший ресурс?

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

1 ответ

Решение

port так Элм общается с миром JS.

Signal (Task x ()) означает, что это сигнал задачи, которая имеет тип ошибки x и вернуть юнит

Вторая строка определяет порт, и это в основном означает, что этот порт будет использоваться для связи с JS, а не от JS.

Если мы посмотрим на определение lookupZipCode мы можем видеть, что это занимает String и возвращает Task String (List String), Глядя на его код, я вижу, что он выполнит Http-запрос к строке запроса и выдаст либо ошибку типа String, либо список строк (список названий городов).

Так Signal.map lookupZipCode query.signal выдает сигнал об этих задачах, которые опрашивают сервер почтового индекса.

В следующем Signal.map мы берем вышеупомянутые задачи и конвертируем их так, чтобы:

  1. ошибка и результат http-запроса объединяются в тип Result. (это означает, что новая задача никогда не потерпит неудачу).
  2. andThen этот тип результата будет отправлен results.address,

Результирующее задание, которое фактически отправляется для выполнения на земле JS, не будет иметь ошибки (вот почему вы видите там x) и приведет к типу модуля (это подпись Signal.send).

Когда Задача действительно выполняется в JS, результат выполнения будет в конечном итоге в result.address как тип Result.

Другие вопросы по тегам