Types 为什么这个变量的实例化度为free?

Types 为什么这个变量的实例化度为free?,types,mercury,Types,Mercury,我已经编写了一个Mercury函数来计算列表骨架的长度,但是它没有编译,我不明白为什么。我想知道这里发生了什么事。(在下面的代码中,指令、函数和模式语句来自Mercury参考手册的章节和。我正在根据手册的声明编写函数体。) 该代码给出了以下编译器错误,其中第26行是TailLength=my_length(Tl): Tl如何获得free的实例化?我的理解是,Tl可以是My_listskel的一个实例,也可以是空列表,它们都是绑定的,而不是自由的 这里的问题是我正在处理一个部分实例化的数据结构(它

我已经编写了一个Mercury函数来计算列表骨架的长度,但是它没有编译,我不明白为什么。我想知道这里发生了什么事。(在下面的代码中,
指令
函数
模式
语句来自Mercury参考手册的章节和。我正在根据手册的声明编写函数体。)

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

Tl
如何获得free的实例化?我的理解是,
Tl
可以是
My_listskel
的一个实例,也可以是空列表,它们都是绑定的,而不是自由的


这里的问题是我正在处理一个部分实例化的数据结构(它还不受支持)?我怀疑可能是这样。但这个例子来自参考手册,它表明这应该得到支持。

我复制了这个问题。您可能是对的,这是因为实现不支持部分实例化的数据结构,即使它们在语言中是合法的。语言与实现是分开的。尽管如此,我还是会询问其他开发人员,并尝试获得更清晰的答案。谢谢
:- 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.
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, ...))'.