在JS中使用FP。
假设我有2个函数
getLine :: () -> IO String
cat :: String -> Task Error String
组成这两个函数的正确方法是什么?
UPD : 除了
,我看不到任何其他解决方案const main = () => compose(map(cat), getLine).performIO().fork(logError, printResult)
但我不确定这是否正确。
答案 0 :(得分:0)
我假设你熟悉Haskell,因为你正在使用Haskell习语。您有以下功能:
getLine :: () -> IO String -- why isn't this simply `getLine :: IO String`?
cat :: String -> Task Error String
你要做的第一件事是摆脱包装IO动作的多余功能:
getLine () :: IO String
然后,您可以使用fmap
撰写cat
和getLine ()
:
fmap cat getLine () :: IO (Task Error String)
最后,假设Task
类似于Either
而fork
类似于either
,我们可以这样做:
fmap cat getLine () >>= fork logError printResult :: IO String
这可以用JavaScript编写如下:
getLine()
.map(cat)
.bind(fork(logError, printResult));
现在,您需要做的就是在JavaScript中为IO操作实现适当的map
和bind
方法。
编辑:要编写它们,您只需在Haskell中执行以下操作:
(>>= fork logError printResult) . fmap cat . getLine :: () -> IO String
在JavaScript中,这将转换为:
compose( bind(fork(logError, printResult))
, fmap(cat)
, getLine
);
这假定fmap
和bind
的定义如下:
function fmap(f) {
return function (x) {
return x.map(f);
};
}
function bind(f) {
return function (x) {
return x.bind(f);
};
}
因此,您仍需要为IO操作实施map
和bind
方法。