为什么这个变量具有免费的实例化?

时间:2014-10-31 21:59:36

标签: types mercury

我已经编写了一个Mercury函数来计算列表骨架的长度,但它没有编译,我也不明白为什么。我想知道这里发生了什么。 (在下面的代码中,instfuncmode语句来自Mercury参考手册,4.14.2部分.I'从手册的声明中写出一个函数体。)

:- inst my_listskel == bound( [] ; [free | my_listskel] ).

:- func my_length(list(T)) = int.
:- mode my_length(in(my_listskel)) = out.

my_length([]) = 0.
my_length([_ | Tl]) = Length :-
    TailLength = my_length(Tl),
    Length = 1 + TailLength.

该代码给出了以下编译器错误,其中第26行是TailLength = my_length(Tl)

mode_test.m:026: In clause for `my_length(in((mode_test.my_listskel))) = out':
mode_test.m:026:   in argument 1 of call to function `mode_test.my_length'/1:
mode_test.m:026:   mode error: variable `Tl' has instantiatedness `free',
mode_test.m:026:   expected instantiatedness was `bound((list.[]) ;
mode_test.m:026:   list.'[|]'(free, ...))'.

Tl如何获得免费的实例化?我的理解是Tl可以是my_listskel的实例,也可以是空列表,并且这两个都是绑定的,而不是自由的。

我的问题是我在处理部分实例化的数据结构(目前还不支持)吗?我怀疑情况可能如此。但是这个例子来自参考手册,它表明这应该得到支持。

0 个答案:

没有答案