前言:从ATS网站学习ATS。
当试图从列表中提取记录时,一旦尝试引用记录变量,就会在下面的x4.a上得到一个类型错误。
那么,为什么这次失败-- x4不会知道它有记录吗?
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(line=77,offs=12) -- 1442(line=77,offs=14):错误(3):a无法找到:类型S2EVar(779)预计为tyrec(记录)。patsopt(TRANS3):总共有一个错误。退出(ATS):未提及的异常:_2home_2hwxi_2Research_2ATS_2dPostiats_2src_2pats_error_2esats__FatalErrorExn(1025)
发布于 2017-02-08 14:13:09
注: x1和x2是不同的类型。他们不可能真的被列在同一个名单上。在这种情况下,x3的类型是list(X,2),它被假定为abc1_rec和abc2_rec的子类型;x4的类型为T,而x4.a给出类型错误,因为打字机无法推断T是记录类型。
https://stackoverflow.com/questions/42103292
复制相似问题