[英]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.