这是排列类型的问题。
让我们组成一些类型定义以供示例使用:
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,// :: 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
添加一个可能会失败的计算。
本文链接:https://www.f2er.com/3165301.html