Понимание этого сигнального кода
Со вчерашнего дня я читаю этот фрагмент кода и пытаюсь найти разумное объяснение. Не могли бы вы проверить правильность моих предположений.
Этот код приходит отсюда.
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 мы берем вышеупомянутые задачи и конвертируем их так, чтобы:
- ошибка и результат http-запроса объединяются в тип Result. (это означает, что новая задача никогда не потерпит неудачу).
andThen
этот тип результата будет отправленresults.address
,
Результирующее задание, которое фактически отправляется для выполнения на земле JS, не будет иметь ошибки (вот почему вы видите там x) и приведет к типу модуля (это подпись Signal.send).
Когда Задача действительно выполняется в JS, результат выполнения будет в конечном итоге в result.address как тип Result.