簡體   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