JS中的函数编程

时间:2016-09-20 13:11:50

标签: javascript functional-programming

在JS中使用FP。
假设我有2个函数

getLine :: () -> IO String
cat :: String -> Task Error String

组成这两个函数的正确方法是什么?

UPD : 除了

,我看不到任何其他解决方案
const main = () => compose(map(cat), getLine).performIO().fork(logError, printResult)

但我不确定这是否正确。

1 个答案:

答案 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撰写catgetLine ()

fmap cat getLine () :: IO (Task Error String)

最后,假设Task类似于Eitherfork类似于either,我们可以这样做:

fmap cat getLine () >>= fork logError printResult :: IO String

这可以用JavaScript编写如下:

getLine()
    .map(cat)
    .bind(fork(logError, printResult));

现在,您需要做的就是在JavaScript中为IO操作实现适当的mapbind方法。

编辑:要编写它们,您只需在Haskell中执行以下操作:

(>>= fork logError printResult) . fmap cat . getLine :: () -> IO String

在JavaScript中,这将转换为:

compose( bind(fork(logError, printResult))
       , fmap(cat)
       , getLine
       );

这假定fmapbind的定义如下:

function fmap(f) {
    return function (x) {
        return x.map(f);
    };
}

function bind(f) {
    return function (x) {
        return x.bind(f);
    };
}

因此,您仍需要为IO操作实施mapbind方法。