2017-02-08 2 views
1

Vorwort dies mit: Lernen ATS von der ATS-Website.ATS Fehler beheben

Wenn ich versuche, einen Datensatz aus einer Liste zu ziehen, sobald ich versuche, auf die Datensatzvariable zu verweisen, erhalte ich einen Typfehler auf x4.a unten.

Also warum scheitert das - würde x4 nicht wissen, dass es eine Aufzeichnung hat?

typedef 
abc1_rec = '{a=int, b=int, c=char} 
typedef 
abc2_rec = '{a=int, b=char, c=string} 

val x1 = '{a=1,b=3,c='A'} : abc1_rec  // boxed record 
val x2 = '{a=1,b='B',c="CAT"} : abc2_rec // boxed record 
val a1 = x2.a        // =1 
val x3 = (x2 :: x1 :: list_nil())   // concat list x2 + x1 + nil 
val x4 = x3.head()       // record x2 

val x5 = x4.a  // error - [a] cannot be found 

/tmp/patsopt_tcats_lu0auT: 1440 (Leitung 77 =, offs = 12) - 1442 (line = 77, offs = 14): Fehler (3): [a] kann nicht gefunden werden: Der Typ [S2EVar (779)] wird erwartet, ein Tyrec (Datensatz) zu sein. patsopt (TRANS3): Es gibt insgesamt [1] Fehler . Ausfahrt (ATS): abgefangene Ausnahme: _2home_2hwxi_2Research_2ATS_2dPostiats_2src_2pats_error_2esats__FatalErrorExn (1025)

Antwort

1

Hinweis x1 und x2 sind von verschiedenen Arten. Sie können nicht wirklich in die gleiche Liste gesetzt werden. In diesem Fall ist der Typ für x3 eine Liste (X, 2) für einige T, von denen angenommen wird, dass sie ein Subtyp von sowohl abc1_rec als auch abc2_rec ist; x4 ist vom Typ T, und x4.a gibt Ihnen einen Typfehler, da der Typchecker nicht schließen kann, dass T ein Datensatztyp ist.

+0

Dafür können Sie einfach schreiben 'val x3 = $ list {abs1_rec} (x2, x1)' –

+0

Oder Sie können 'val x3 = list_cons (x2, list_cons (x1, list_nil {abs1_rec}())' schreiben –

+0

Vielen Dank, dass hilft.Wenn ich alle die gleiche Art "abc1_rec" verwenden würde val x3 = (x2 :: x1 :: list_nil()) geben Sie mir list (abc1_rec, 2)? Wo :: list_cons neu definiert. – Pezhead9000