这是排列类型的问题。
让我们组成一些类型定义以在示例中使用:
foo :: String -> String
bar :: String -> Future Error String
baz :: String -> Array String
现在,让我们一步一步地创建我们的程序……</p>
// 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
or 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
添加一个可能失败的计算可能会有所帮助。