2012-06-15 93 views
2
  1. 有人可以解釋它們之間的區別嗎?SML - 遞歸數據類型VS多態數據類型

  2. 此外,嘗試當:

datatype exp = Const of real | Pair of exp * exp; 

val my_exp_2 = Pair(Const(1.2),Pair(Const(9.0),Const(2.0))); 

的解釋給出了:

val my_exp_2 = Pair (Const 1.2,Pair (Const #,Const #)) : exp 

爲什麼#符號出現在那裏?

謝謝!

+4

閱讀#as ... - 那裏有更多的嵌套表達式,但打印機爲了便於閱讀而縮寫它們。如果這是SML/NJ,您可以設置例如'Control.Print.printDepth:= 10'來調整它。 –

回答

5

A 遞歸數據類型是一個數據類型,它在其定義中使用自身。

這方面的一個例子是:

datatype intlist = IntNil 
       | IntCons of int * intlist 

通知intlist是如何在IntCons值構造函數的定義中使用。

val ls = IntCons(5, IntCons(6, IntNil)); 

請注意IncCons在本例中如何包含另一個列表值。

A 多態數據類型是一種數據類型,其中一個或多個值構造函數可以包含多態值。

舉例來說,你可以看看:

datatype 'a pair = Pair of 'a * 'a 

這裏,'a是一個類型變量,這樣的構造可以在任何類型的值來使用。例如:

val pairInt = Pair(1, 5); 
val pairStr = Pair("Hello", "Goodbye"); 
val pairChr = Pair(#"x", #"y"); 

這兩件事情常常合併成多態性遞歸數據類型,如爲正常列表完成:

datatype 'a mylist = MyNil 
        | MyCons of 'a * 'a mylist; 

這既是多態性,遞歸的,如可以在這些實施例中可以看出:

val listInt = MyCons(5, MyCons(6, MyNil)); 
val listStr = MyCons("abc", MyCons("def", MyNil)); 
val listChr = MyCons(#"a", MyCons(#"b", MyNil));