Как объявить пред для предиката, который импортирует или выводит списки?

Нужна помощь в объявлении pred для предиката, который импортирует или выводит списки. Я пытался: - имя пред (list:: in, integer::out) является multi. и сообщение об ошибке компилятора говорит, что list/0 не распознан. Проверил список модулей библиотеки и увидел, что я должен написать что-то вроде...(list(T)::in . . .), Но не до конца понял, что делать.

2 ответа

Решение

Список - это параметрический тип, параметрические типы принимают один или несколько параметров. В случае со списком параметр говорит, что это за список. У вас может быть список чисел, список строк, список тыкв или список списков номеров (любой допустимый тип). Итак, если я создаю функцию, такую ​​как:

:- func max(list(int)) = int.

Эта функция принимает список целых и возвращает целое число (максимальное число, найденное в списке).

Итак, что со списком (T)? Токен, начинающийся с заглавной буквы, является переменной, даже в типах. Он может обозначать любой другой тип (обычно). Таким образом, "список (T)" означает список чего угодно, например, список чисел или строк. Следующий предикат является полиморфным, он работает для разных типов в зависимости от фактических значений его переменной типа.

:- pred first(list(T)::in, T::out) is semidet.

Список всего может быть передан как первый элемент в списке, если таковой имеется. Если это используется со списком строк "list(string)", то T будет заменен (во время компиляции) на "string".

Ссылка для этой части системы типов Меркурия находится здесь. http://www.mercurylang.org/information/doc-release/mercury_ref/Discriminated-unions.html

Я попытался:- pred name(...list(T),....) is ... и компилятор больше не сообщает об ошибках, связанных с моим объявлением pred. Пока не знаю, что результаты будут правильными, но на шаг ближе.

Другие вопросы по тегам