解决ATS类型错误

时间:2017-02-08 01:49:45

标签: ats

前言:从ATS网站学习ATS。

当尝试从列表中提取记录时,一旦我尝试引用记录变量,我在下面的x4.a上会出现类型错误。

那么为什么这会失败 - 不会知道它有记录吗?

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):error(3):找不到[a]:类型[S2EVar(779)]是   预计将是一个tyrec(记录)。 patsopt(TRANS3):有[1]错误   总共。退出(ATS):未捕获的异常:   _2home_2hwxi_2Research_2ATS_2dPostiats_2src_2pats_error_2esats__FatalErrorExn(1025)

1 个答案:

答案 0 :(得分:1)

注意x1和x2的类型不同。他们无法真正被投入 相同的清单。在这种情况下,x3的类型是某些T的列表(X,2),假定它是abc1_recabc2_rec子类型; x4的类型为T,x4.a会给出类型错误,因为类型检查器无法推断出T是记录类型。