Это вопрос выравнивания типов.
Давайте создадим некоторые определения типов для использования в примере:
foo :: String -> String
bar :: String -> Future Error String
baz :: String -> Array String
Теперь давайте создадим нашу программу шаг за шагом ...
// program :: a -> a
const program = S.pipe ([
]);
// program :: String -> String
const program = S.pipe ([
foo, // :: String
]);
// program :: String -> Future Error String
const program = S.pipe ([
foo, // :: String
bar, // :: Future Error String
]);
// program :: String -> Future Error (Array String)
const program = S.pipe ([
foo, // :: String
bar, // :: Future Error String
S.map (baz), // :: Future Error (Array String)
]);
Для работы с b
внутри значения Future a b
мы используем S.map
или S.chain
.
S.map
может привести к нежелательному вложению:
fut :: Future Error String
quux :: String -> Future Error Number
S.map (quux) (fut) :: Future Error (Future Error Number)
Мы могли бы использовать S.chain
, чтобы избежать этого размещения:
fut :: Future Error String
quux :: String -> Future Error Number
S.chain (quux) (fut) :: Future Error Number
Может быть полезно подумать о S.map
добавлении к некоторым вычислениямоперация, которая не может завершиться ошибкой, тогда как S.chain
добавляет вычисление, которое может завершиться неудачей.