我编写了一个 Mercury 函数来计算列表骨架的长度,但它没有编译,我不明白为什么。我想知道这里发生了什么。(在下面的代码中,inst
、func
和mode
语句来自 Mercury 参考手册的第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
获得免费的实例化?我的理解是,Tl
它既可以是一个实例,也可以是my_listskel
空列表,并且这两个都是绑定的,而不是免费的。
我的问题是我正在处理部分实例化的数据结构(尚不支持)吗?我怀疑可能是这种情况。但是示例来自参考手册,这表明应该支持这一点。