2017-01-02 32 views
0

我剛剛開始使用Monads,並且一直在學習Maybe,IO或者IO(aka Task?)。Javascript單子 - 分層功能路徑?

是否有Monad可以根據輸入決定行動方案?例如,如果輸入以'http'開頭,則執行fn(輸入)。如果輸入以'縮短'開始,執行fn2(輸入)?最後,如果輸入是'完成',那麼fn3(輸入)。或者這種分支違反了一些函數式編程規律?

+0

你剛纔描述的是... –

+0

我很好奇因爲幾乎所有我見過的在線資源限制其中一個分支到某種類型的空檢查。可以使用模仿if .. else ...? – bresson

+0

如果你正在做的是空檢查你應該使用'也許'。分支是什麼'無論是* *爲* ...這是一個體面的例子在打字稿https://tech.evojam.com/2016/03/21/practical-intro-to-monads-in-javascript-e/ –

回答

0

一元構圖的重點在於,您可以完全按照您的要求進行操作 - 根據以前的結果決定進一步的計算。我們首先看一下(隱含的)Javascript monad,即在編寫直線Javascript代碼時使用的非指定的monad。在這裏,你可以寫

var s = document.getElementById("myTextBox").value; // effect: looking at current DOM state 
if (s == "foo") 
{ 
    document.getElementById("output").textContents = "OK." // effect: changing the DOM 
} else { 
    window.alert("What?"); // effect: popup dialog 
} 

你可以在這裏看到的計算,包括重要的是,它的效果,根據第一行動(的getElementById().value結果)的結果變化。

在其他的,被通化的monads中,你可以完全相同;例如(使用Haskell語法這裏,因爲我不知道流行的JavaScript庫,單子是什麼樣子)與Maybe

parse :: String -> Maybe Command 
parse = ... 

reply :: String -> Maybe String 
reply s = do 
    cmd <- parse s -- effect: fails if `s` is not a valid command 
    case cmd of 
     Say s' -> Just s' -- effect: succeeds with s' 
     _ -> Nothing -- effect: failure 

同樣發生在這裏:根據parse s的結果,接下來的效果還可以要麼失敗的成功。