考慮以下代碼:
1 def overloading x = "General overloading"
2 func overloading::string->string
3 def overloading str = "String overloading"
4 func overloading T::list T->string
5 def overloading xs = "List overloading"
這是三個(gè)函數(shù),類(lèi)型分別為:
1 func overloading T1 :: (<T1> -> (system.list system.char)) codefrom 125
2 func overloading :: ((system.list system.char) -> (system.list system.char)) codefrom 127
3 func overloading T1 :: ((system.list <T1>) -> (system.list system.char)) codefrom 129
所以當(dāng)我們寫(xiě)overloading的時(shí)候,究竟選擇什么呢?三個(gè)類(lèi)型都是可以接受的,而且都是可以完美通過(guò)類(lèi)型推導(dǎo)的。于是我新加了一個(gè)規(guī)則。首先求出需要的具體類(lèi)型(可能是含有參數(shù)的類(lèi)型),然后計(jì)算從函數(shù)類(lèi)型到具體類(lèi)型所需要替換的類(lèi)型參數(shù)的個(gè)數(shù)以及每個(gè)類(lèi)型參數(shù)的解,最后計(jì)算出一個(gè)系數(shù)=數(shù)量×65536+解的深度和。
深度的規(guī)定比較簡(jiǎn)單,基本類(lèi)型深度為1,閉包類(lèi)型為參數(shù)和結(jié)果兩種類(lèi)型的深度的最大值加1,帶有參數(shù)的類(lèi)型等于最大參數(shù)深度加1。所以在這個(gè)例子上,我們可以得到,T1到list char的解為T(mén)1=list char,list char到list char的解為0,list T1到list char的解為T(mén)1=char,系數(shù)分別是65538、0和65537,所以理所當(dāng)然地挑選了第二個(gè)。下面看例子:
1 def main114 = overloading 1024
2 def main115 = overloading "Genius Vczh!"
3 def main116 = overloading [1,2,3]
下面是運(yùn)行結(jié)果:
1 main114返回值:"General overloading"
2 main115返回值:"String overloading"
3 main116返回值:"List overloading"
posted on 2008-12-14 19:42
陳梓瀚(vczh) 閱讀(1480)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
腳本技術(shù)