Перевозка Волка, Козы И Капусты Через Реку С Эффектами На Haskell

Однажды крестьянину нужно было перевезти через реку волка, козу и капусту.

У мужика есть лодка, в которую, кроме самого мужика, может поместиться только один предмет — или волк, или козел, или капуста.

Если крестьянин оставит волка с козой без присмотра, волк съест козу; Если фермер оставит без присмотра козу с капустой, коза съест капусту.



Перевозка волка, козы и капусты через реку с эффектами на Haskell

В этой статье мы попытаемся найти обобщенное решение этого типа головоломки и для этого воспользуемся алгебраическими эффектами.

Начнем с самого простого – маршрута путешествия.

Поскольку мы заранее не знаем, за какое гарантированное количество шагов мы получим решение, мы можем построить бесконечный маршрут, но будем все равно лениво его вычислять:

  
   

data Direction = Back | Forward route :: [Direction] route = iterate alter Forward alter :: Direction -> Direction alter Back = Forward alter Forward = Back

Поскольку мы собираемся строить обобщенное решение, то абстрагируемся и от персонажей.

Построим нетранзитивное симметричное отношение порядка между элементами набора символов (поделитесь в комментариях, есть ли для этого устоявшееся название):

data Character = Wolf | Goat | Cabbage deriving Eq class Survivable a where

Теги: #Алгоритмы #Функциональное программирование #haskell #functor #traversable #monad #applicative
Вместе с данным постом часто просматривают: