經(jīng)過
上一次的成功試驗,這次終于完成了剩余的表達式類型的類型推導。過程及結果如下:
修改if函數(shù)的代碼,去掉類型聲明:
1 def if cond t f = select cond of
2 case true : t
3 case false : f
4 end
為了對lambda expression進行推導,將makearray的表達式isub max 1替換成(\a->\b->isub a b) max 1:
1 def makearray max = if (iequ max 0)
2 empty
3 (list max (makearray ((\a->\b->isub a b) max 1)))
然后進行推導。由于推導的時候沒有根據(jù)依賴關系(函數(shù)可以循環(huán)依賴)來確定推導順序,因此采用了迭代的方法。編譯器不斷推導一直到無法得到更好的結果為止(實現(xiàn)的時候有一個很方便的判斷方法)。
首先對if進行推導。因為cond使用了true和false進行模式匹配,因此cond一定是system.bool。其次,兩個表達式分別返回t與f,可以判斷t與f的類型必定相同。因此,可以很容易的得到if的結果:
1 func if T1 :: (system.bool -> (<T1> -> (<T1> -> <T1>)))
其次對makearray進行推導。進行到(\a->\b->isub a b)的時候,因為max類型位置,標記為?,1類型為system.int。因此該lambda expression的期望類型為?1 -> system.int -> ?2。因為isub a b,因此a一定是int,而且isub接受兩個int返回bool,因此該lambda expression的推導類型為system.int -> system.int -> system.bool。所以得到makearray的類型如下:
1 func makearray :: (system.int -> (system.list system.int))
結果跟昨天等價的更簡單的寫法一致。
posted on 2008-10-06 06:47
陳梓瀚(vczh) 閱讀(1506)
評論(1) 編輯 收藏 引用 所屬分類:
腳本技術