<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 應用 applicative functor ``` // 這樣是行不通的,因為 2 和 3 都藏在瓶子里。 add(Container.of(2), Container.of(3)); //NaN // 使用可靠的 map 函數試試 var container_of_add_2 = map(add, Container.of(2)); // Container(add(2)) ``` 這時候我們創建了一個`Container`,它內部的值是一個局部調用的(partially applied)的函數 我們想讓`Container(add(2))`中的`add(2)`應用到`Container(3)`中的`3`上來完成調用。也就是說,我們想把一個 functor 應用到另一個`functor`上 使用 chain 實現 ``` Container.of(2).chain(function(two) { return Container.of(3).map(add(two)); }); ``` 這種方式有一個問題,那就是 monad 的順序執行問題:所有的代碼都只會在前一個 monad 執行完畢之后才執行 ## ap ap 就是這樣一種函數,能夠把一個 functor 的函數值應用到另一個 functor 的值上 ``` Container.of(add(2)).ap(Container.of(3)); // Container(5) // all together now Container.of(2).map(add).ap(Container.of(3)); // Container(5) ``` `Container(3)`從嵌套的 monad 函數的牢籠中釋放了出來 實現ap函數 ``` Container.prototype.ap = function(other_container) { return other_container.map(this.__value); } ``` 特性 ``` F.of(x).map(f) == F.of(f).ap(F.of(x)) ``` ## 協調與激勵 假設我們要創建一個旅游網站,既需要獲取游客目的地的列表,還需要獲取地方事件的列表。這兩個請求就是相互獨立的 api 調用。 ``` // Http.get :: String -> Task Error HTML var renderPage = curry(function(destinations, events) { /* render page */ }); Task.of(renderPage).ap(Http.get('/destinations')).ap(Http.get('/events')) // Task("<div>some page with dest and events</div>") ``` 兩個請求將會同時立即執行,當兩者的響應都返回之后,`renderPage`就會被調用。這與 monad 版本的那種必須等待前一個任務完成才能繼續執行后面的操作完全不同。本來我們就無需根據目的地來獲取事件,因此也就不需要依賴順序執行 ### 例子 ``` // 幫助函數: // ============== // $ :: String -> IO DOM var $ = function(selector) { return new IO(function(){ return document.querySelector(selector) }); } // getVal :: String -> IO String var getVal = compose(map(_.prop('value')), $); // Example: // =============== // signIn :: String -> String -> Bool -> User var signIn = curry(function(username, password, remember_me){ /* signing in */ }) IO.of(signIn).ap(getVal('#email')).ap(getVal('#password')).ap(IO.of(false)); // IO({id: 3, email: "gg@allin.com"}) ``` `signIn`是一個接收 3 個參數的 curry 函數,因此我們需要調用`ap`3 次。在每一次的`ap`調用中,`signIn`就收到一個參數然后運行,直到所有的參數都傳進來,它也就執行完畢了
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看