Почему эта переменная имеет экземпляр free?

Я написал функцию 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, либо пустым списком, и что оба они будут связаны, а не свободны.

Моя проблема в том, что я имею дело с частично созданной структурой данных (которая еще не поддерживается)? Я подозреваю, что это может быть так. Но пример из справочного руководства, который предполагает, что это должно поддерживаться.


person Evan    schedule 31.10.2014    source источник
comment
Я воспроизвел эту проблему. Вы, вероятно, правы, потому что частично созданные структуры данных не поддерживаются реализацией, даже если они разрешены в языке. Язык отделен от реализации. Тем не менее, я спрошу у других разработчиков и попытаюсь получить более четкий ответ. Спасибо.   -  person Paul Bone    schedule 04.11.2014