繁体   English   中英

JS中的函数式编程

[英]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组合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方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM