为什么这个变量有免费的instantiatedness?(Why does this variabl

2019-10-21 04:54发布

我写了一个水星函数来计算列表骨架的长度,但它并没有编译,我不明白为什么。 我想知道是怎么回事。 (在下面的代码中, instfuncmode语句是从水星参考手册,章节4.1和4.2 。我正在写在手册的声明函数体)。

:- 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获得免费的instantiatedness? 我的理解是Tl可以是实例my_listskel或空列表,而这些都将被约束,不自由。

是我的问题在这里,我负责的部分实例化的数据结构(目前还不支持)? 我怀疑这可能是这种情况。 但例子是从参考手册,这表明这应该被支持。

文章来源: Why does this variable have an instantiatedness of free?
标签: types mercury