這幾天一直在忙學(xué)校的比賽,到了今天終于有空了。
Lazy Script的語(yǔ)法實(shí)在是很復(fù)雜,因此不得不在進(jìn)行第一步的名字檢查之后把原本的語(yǔ)言轉(zhuǎn)換為內(nèi)部使用的一種元語(yǔ)言。這種元語(yǔ)言設(shè)計(jì)的原則是盡量簡(jiǎn)單。譬如[y|y<-xs , y<x]這樣的語(yǔ)法和do-end語(yǔ)句就需要被轉(zhuǎn)換掉。進(jìn)行了轉(zhuǎn)換以后,就需要對(duì)元語(yǔ)言進(jìn)行一個(gè)類型方程組的建立。這一步暫時(shí)還沒有建模好,而且實(shí)際工作需不需要真的構(gòu)造出一組方程組還不知道。目前還比較沒有頭緒的就是如何對(duì)模板函數(shù)的類型方程建模。
舉個(gè)例子,譬如我們對(duì)上一篇文章中提到的代碼進(jìn)行類型方程組的構(gòu)造:
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))
)
對(duì)上面的函數(shù)調(diào)用類型進(jìn)行進(jìn)一步的推導(dǎo),我們可以得到:
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
緊接著繼續(xù)推導(dǎo),我們有:
(<=)::(Int -> Int -> Bool | Float -> Float -> Bool) T(num) = Int
(-)::((Int -> Int -> Int | Float -> Float -> Float) T(num) = Int
[T1] = [T(num)]
[T1] = T(list)
根據(jù)上面的式子我們可以得到:
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]
至于如何為上面的整個(gè)過(guò)程建模,還得在這幾天內(nèi)想出辦法來(lái)。現(xiàn)在唯一知道的就是,構(gòu)造一個(gè)類型方程組需要確定解的名字,然后求解。解還有若干種,譬如確定解,模板解等等。具體細(xì)節(jié)還需要繼續(xù)斟酌。
posted on 2008-04-27 10:16
陳梓瀚(vczh) 閱讀(2133)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Vczh Lazy Script