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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 1. ![](https://box.kancloud.cn/2015-07-22_55af659abe60e.png) 軟件最基本的數據,就是各種值(value)。 ## 2. ![](https://box.kancloud.cn/2015-07-22_55af659cad7c7.png) 處理值的一系列操作,可以封裝成函數。輸入一個值,會得到另一個值。上圖的"(+3)"就是一個函數,對輸入的值加上3,再輸出。 ## 3. ![](https://box.kancloud.cn/2015-07-22_55af659da8afb.png) 函數很像漏斗,上面進入一個值,下面出來一個值。 ## 4. ![](https://box.kancloud.cn/2015-07-22_55af659f36e08.png) 函數可以連接起來使用,一個函數接著另一個函數。 ## 5. ![](https://box.kancloud.cn/2015-07-22_55af659f7031c.png) 函數還可以依次處理數據集合的每個成員。 ## 6. ![](https://box.kancloud.cn/2015-07-22_55af65a0af620.png) 說完了函數,再來看第二個概念:數據類型(type)。 數據類型就是對值的一種封裝,不僅包括值本身,還包括相關的屬性和方法。上圖就是2的封裝,從此2就不是一個單純的值,而是一種數據類型的實例,只能在數據類型的場景(context)中使用。 ## 7. ![](https://box.kancloud.cn/2015-07-22_55af65a22889f.png) 2變成數據類型以后,原來的函數就不能用了。因為"(+3)"這個函數是處理值的(簡稱"值函數"),而不是處理數據類型的。 ## 8. ![](https://box.kancloud.cn/2015-07-22_55af65a76e00f.png) 我們需要重新定義一種運算。它接受"值函數"和數據類型的實例作為輸入參數,使用"值函數"處理后,再輸出數據類型的另一個實例。上圖的fmap就代表了這種運算。 ## 9. ![](https://box.kancloud.cn/2015-07-22_55af65ad1e57b.png) fmap的內部,實際上是這樣:打開封裝的數據類型,取出值,用值函數處理以后,再封裝回數據類型。 ## 10. ![](https://box.kancloud.cn/2015-07-22_55af65b19d09d.png) 一個有趣的問題來了。如果我們把函數也封裝成數據類型,會怎樣? 上圖就是把函數"(+3)"封裝成一種數據類型。 ## 11. ![](https://box.kancloud.cn/2015-07-22_55af65b4b3539.png) 這時,就需要再定義一種新的運算。它不是值與值的運算,也不是值與數據類型的運算,而是數據類型與數據類型的運算。 上圖中,兩個數據類型進行運算。首先,取出它們各自的值,一個是函數,一個是數值;然后,使用函數處理數值;最后,將函數的返回結果再封裝進數據類型。 ## 12. ![](https://box.kancloud.cn/2015-07-22_55af65bab37cd.png) 函數可以返回值,當然也可以返回數據類型。 ## 13. ![](https://box.kancloud.cn/2015-07-22_55af65bb2c16d.png) 我們需要的是這樣一種函數:它的輸入和輸出都是數據類型。 ## 14. ![](https://box.kancloud.cn/2015-07-22_55af65bbdd140.png) 這樣做的好處是什么? 因為數據類型是帶有運算方法的,如果每一步返回的都是數據類型的實例,我們就可以把它們連接起來。 ## 15. ![](https://box.kancloud.cn/2015-07-22_55af65c4cb8f0.png) 來看一個實例,系統的I/O提供了用戶的輸入。 ## 16. ![](https://box.kancloud.cn/2015-07-22_55af65cb5bd5e.png) getLine函數可以將用戶的輸入處理成一個字符串類型(STR)的實例。 ## 17. ![](https://box.kancloud.cn/2015-07-22_55af65cb8f757.png) readfile函數接受STR實例當作文件名,返回一個文件類型的實例。 ## 18. ![](https://box.kancloud.cn/2015-07-22_55af65cc15b4e.png) putStrLn函數將文件內容輸出。 ## 19. ![](https://box.kancloud.cn/2015-07-22_55af65cd189c3.png) 所有這些運算連起來,就叫做Monad。 簡單說,Monad就是一種設計模式,表示將一個運算過程,通過函數拆解成互相連接的多個步驟。你只要提供下一步運算所需的函數,整個運算就會自動進行下去。
                  <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>

                              哎呀哎呀视频在线观看