Какие проблемы решает выбор карри?
Я знаком с тем, какой выбор оператора ((?)
), принимает два аргумента и соответствует им обоим. Мы могли бы определить это следующим образом:
a?_=a
_?b=b
Это может быть использовано для введения недетерминизма между двумя значениями. Однако, что я не понимаю, почему мы хотели бы сделать это.
Что может быть примером проблемы, которая может быть решена с помощью (?)
?
1 ответ
Одним примером, который обычно используется для мотивации недетерминизма, является функция, которая вычисляет все перестановки списка.
insert e [] = [e]
insert e (x:xs) = (e : x : xs) ? (x : insert e xs)
perm [] = []
perm (x:xs) = insert x (perm xs)
Приятно то, что вам не нужно указывать, как вы хотите перечислять все списки, алгоритм поиска, который лежит в основе логического языка программирования, такого как Curry (по умолчанию это поиск в глубину), сделает всю работу за вас. Вы просто указываете, как должен выглядеть список в вашем результате.
Надеюсь, вы найдете более реалистичные примеры в следующих статьях.
Новые шаблоны функциональной логики
Шаблоны функциональной логики
Изменить: Поскольку я недавно опубликовал работу по этой теме, я хочу добавить приложение вероятностного программирования. В статье мы показываем, что использование недетерминизма для моделирования вероятностных значений может иметь преимущества для основанных на списках подходов в отношении сокращения пространства поиска. Точнее говоря, когда мы выполняем запрос по вероятностным значениям, то есть фильтруем распределение на основе предиката, недетерминизм ведет себя менее строго, чем подходы на основе списка, и может сократить пространство поиска.