2010-09-15 385 views
9

有什麼方法檢查/測試變量的類型嗎?SML如何檢查變量類型?

我想用這樣的:

if x = int then foo 
else if x = real then bar 
else if x = string then ... 
    else ..... 

回答

20

ML語言都是靜態類型,因此它不可能爲某事有不同的類型在不同的時間。 x有時不能有類型int而在其他時間有string類型。如果你需要這樣的行爲,正常的方式去了解它在編碼輸入信息,就像一個容器來包裝值:

datatype wrapper = Int of int | Real of real | String of string 

然後你可以模式匹配的構造函數:

case x of Int x -> foo 
     | Real x -> bar 
     | String x -> ... 

在這種情況下,x顯然類型爲wrapper,這樣會奏效。

8

這是不可能做你一般想要的東西,即使是x多態型的(沒有做包裝自己是查克建議)。

這是一個慎重的設計決定;它可以就功能做出非常強有力的結論,只是基於它們的類型,否則就無法做出來。例如,它可以讓你說一個'a -> 'a類型的函數必須是標識函數(或者一個總是拋出異常的函數,或者永不返回的函數)。如果你能檢查什麼'a是在運行時,你可以寫一個鬼鬼祟祟的程序像

fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x 

這將違反規則。 (這是一個非常簡單的例子,但是通過知道你的類型系統有這個屬性可以做很多不太重要的事情。)