<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國際加速解決方案。 廣告
                [TOC] ## Hindley-Milner 類型簽名 - 類型(type)是讓所有不同背景的人都能高效溝通的元語言 - 類型簽名還衍生出了 “自由定理(free theorems)” 的概念 - 因為類型是可以推斷的,所以明確的類型簽名并不是必要的 - 類型簽名不但可以用于編譯時檢測(compile time checks),還是最好的文檔 ## 類型簽名實例 實例1 ``` // match :: Regex -> (String -> [String]) var match = curry(function(reg, s){ return s.match(reg); }); // onHoliday :: String -> [String] var onHoliday = match(/holiday/ig); ``` - 函數都寫成類似 a -> b 這個樣子,其中 a 和b 是任意類型的變量 - 因此,capitalize 函數的類型簽名可以理解為“一個接受 String 返回 String 的函數” - 每傳一個參數,就會彈出類型簽名最前面的那個類型 實例2 ``` // id :: a -> a var id = function(x){ return x; } ``` - `a->a` 表示從任意類型轉到任意類型,但是類型是同一類型 實例3 ``` // map :: (a -> b) -> [a] -> [b] var map = curry(function(f, xs){ return xs.map(f); }); ``` - b 可能與 a 類型相同,也可能不相同 - 簽名說明:map 接受兩個參數,第一個是**函數**(從任意類型 a 到任意類型 b 的函數);第二個是一個**數組**,元素是任意類型的 a;map 最后返回的是一個類型 b 的**數組** ## 縮小可能性范圍 一旦引入一個類型變量,就會出現一個奇怪的特性叫做*parametricity*,。這個特性表明,函數將會*以一種統一的行為作用于所有的類型* ``` // reverse :: [a] -> [a] ``` 意看`head`,可以看到它接受`[a]`返回`a`。我們除了知道參數是個`數組`,其他的一概不知;所以函數的功能就只限于操作這個數組上 類型`a`的多態性(polymorphism)都會大幅縮小`reverse`函數可能的行為的范圍 ## 自由定理 ``` // head :: [a] -> a compose(f, head) == compose(head, map(f)); // filter :: (a -> Bool) -> [a] -> [a] compose(map(f), filter(compose(p, f))) == compose(filter(p), map(f)); ``` 第一個例子中,等式左邊說的是,先獲取數組的`頭部`(譯者注:即第一個元素),然后對它調用函數`f`;等式右邊說的是,先對數組中的每一個元素調用`f`,然后再取其返回結果的`頭部`。這兩個表達式的作用是相等的,但是前者要快得多 ## 類型約束 簽名也可以把類型約束為一個特定的接口(interface) ``` // sort :: Ord a => [a] -> [a] ``` 胖箭頭左邊表明的是這樣一個事實:a 一定是個 Ord 對象。也就是說,a 必須要實現 Ord 接口。Ord 到底是什么?它是從哪來的?在一門強類型語言中,它可能就是一個自定義的接口,能夠讓不同的值排序
                  <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>

                              哎呀哎呀视频在线观看