[英]Functional programming in JS
在 JS 中玩 FP。
假设我有两个功能
getLine :: () -> IO String
cat :: String -> Task Error String
组合这两个函数的正确方法是什么?
UPD :除此之外,我看不到任何其他解决方案
const main = () => compose(map(cat), getLine).performIO().fork(logError, printResult)
但我不确定这是正确的做法。
我假设您熟悉 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
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.