• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                這幾天一直在忙學校的比賽,到了今天終于有空了。

                Lazy Script的語法實在是很復雜,因此不得不在進行第一步的名字檢查之后把原本的語言轉換為內部使用的一種元語言。這種元語言設計的原則是盡量簡單。譬如[y|y<-xs , y<x]這樣的語法和do-end語句就需要被轉換掉。進行了轉換以后,就需要對元語言進行一個類型方程組的建立。這一步暫時還沒有建模好,而且實際工作需不需要真的構造出一組方程組還不知道。目前還比較沒有頭緒的就是如何對模板函數的類型方程建模。

                舉個例子,譬如我們對上一篇文章中提到的代碼進行類型方程組的構造:
            1 makelist num list = if (num<=0)
            2     list
            3     (makelist (num-1) ([num]++list));

                我們找到的已定義名稱有:
                ·(<=) :: Int -> Int -> Bool | Float -> Float -> Bool
                ·if :: Bool -> T -> T -> T
                ·(++) :: [T] -> [T] -> [T]
                ·(-) :: Int -> Int -> Int | Float -> Float -> Float
                ·0 :: Int
                ·1 :: Int

                為上面的程序建立方程組,我們可以得到:
                T(makelist) T(num) T(list) =
                (Bool -> T0 -> T0 -> T0)
                    ((<=)::(Int -> Int -> Bool | Float -> Float -> Bool) T(num) Int)
                    T(list)
                    (T(makelist)
                        ((-)::(Int -> Int -> Int | Float -> Float -> Float) T(num) Int)
                        ((++)::([T1] -> [T1] -> [T1]) [T(num)] T(list))
                    )

                對上面的函數調用類型進行進一步的推導,我們可以得到:
                Bool = (<=)::(Int -> Int -> Bool | Float -> Float -> Bool) T(num) Int
                T0 = T(list)
                T0 = T(makelist)  ((Int -> Int -> Int | Float -> Float -> Float) T(num) Int) ((++)::([T1] -> [T1] -> [T1]) [T(num)] T(list))
                T(makelist) T(num) T(list) = T0

                緊接著繼續推導,我們有:
                (<=)::(Int -> Int -> Bool | Float -> Float -> Bool) T(num) = Int
                (-)::((Int -> Int -> Int | Float -> Float -> Float) T(num) = Int
                [T1] = [T(num)]
                [T1] = T(list)

                根據上面的式子我們可以得到:
                T(num)=Int
                T1=Int
                T(list)=[Int]
                (++)::[Int] -> [Int] -> [Int]
                (<=)::Int -> Int -> Bool
                (-):: Int -> Int -> Int
                T0 = [Int]
                if :: Bool -> [Int] -> [Int]
                makelist :: [Int] -> [Int] -> [Int]

                至于如何為上面的整個過程建模,還得在這幾天內想出辦法來。現在唯一知道的就是,構造一個類型方程組需要確定解的名字,然后求解。解還有若干種,譬如確定解,模板解等等。具體細節還需要繼續斟酌。
            posted on 2008-04-27 10:16 陳梓瀚(vczh) 閱讀(2139) 評論(0)  編輯 收藏 引用 所屬分類: Vczh Lazy Script
            久久综合狠狠综合久久综合88| 国产福利电影一区二区三区,免费久久久久久久精| 国产精品久久久久久影院| 伊人久久大香线焦AV综合影院| 久久狠狠爱亚洲综合影院 | 久久久久亚洲AV无码专区首JN| 无码人妻久久一区二区三区蜜桃| 婷婷久久综合九色综合九七| 伊人久久大香线蕉成人| 久久天堂AV综合合色蜜桃网| 国产精品久久午夜夜伦鲁鲁| 国产免费久久精品丫丫| 亚洲一区精品伊人久久伊人| 久久精品国产亚洲av麻豆色欲| 久久久久夜夜夜精品国产| 亚洲国产精品无码久久九九| 久久久久无码精品国产| 久久精品国产精品亜洲毛片| 久久综合精品国产二区无码| 久久最新免费视频| 国产精品久久久久AV福利动漫| 久久人妻少妇嫩草AV无码蜜桃| 久久天天躁狠狠躁夜夜躁2O2O| 日韩精品无码久久一区二区三| 欧美丰满熟妇BBB久久久| 人妻系列无码专区久久五月天| 久久人妻少妇嫩草AV无码专区| 久久久久久亚洲精品不卡| 99久久精品国产高清一区二区| 久久婷婷五月综合成人D啪| 国产—久久香蕉国产线看观看| 99热成人精品热久久669| 一本色道久久综合亚洲精品| 亚洲欧美精品一区久久中文字幕| 美女写真久久影院| 久久国产高清字幕中文| 久久久久久久久久久久中文字幕 | 久久久久亚洲av无码专区喷水| 合区精品久久久中文字幕一区| 伊人久久大香线焦综合四虎 | 久久成人国产精品二三区|