Я много программировал на Прологе, и хотя я люблю язык за его выразительную силу, я должен согласиться с svenningsson, что, как только вы попытаетесь сделать что-то не декларативное, использование головоломки становится загадкой!оператор (вырезать, отбрасывает опции возврата) в нужных местах, что чрезвычайно подвержено ошибкам.
Хотя и не идеально, один из языков, который элегантно умудряется комбинировать код возврата и не декларативный (обязательный / побочный эффект) код, - это Icon,Он в основном изолирует выражения, которые могут естественным образом откатываться от общей структуры программы (например, операторов), так что относительно легко увидеть, что откат назад не приведет к неожиданным результатам, как в Prolog.Я не уверен, почему не основано больше языков на этой модели выполнения, я полагаю, что большинство программистов действительно застряли в последовательном мышлении, а обратный путь вводит в заблуждение.
Я не уверен, если обратный анализ сравнивается с полиморфизмомнепосредственно.Для меня это больше альтернатива замыканиям, поскольку использование # 1 замыканий в большинстве языков - это пользовательская итерация (например, map / filter / fold и т. Д.).Например, в Icon я могу сказать:
every write 10<(1..10)*2
, который берет последовательность чисел, умножает их на два, отфильтровывает эти> 10 и печатает результат («каждый» бит похож на повторениеОшибка цикла в Прологе).На языке, основанном на списках / замыканиях, я должен написать:
for (filter (map [1..10] \x.x*2) \x.x>10) \x.(write x)
предоставлено, это немного условно, так как понимание списков и каррирование могут упростить это, и не весь код значка такой краткий, но вы получаетеидея.Версия Icon не только более выразительна, но и имеет то преимущество, что она не использует промежуточные списки и «ленива» в параллельном смысле, то есть она выпишет первое число, прежде чем выполнить * 2 навторой элемент.Это означает, что он позволяет вам писать код, который одинаково эффективен, даже если вы не используете все сгенерированные результаты.