Однажды крестьянину нужно было перевезти через реку волка, козу и капусту.Теги: #Алгоритмы #Функциональное программирование #haskell #functor #traversable #monad #applicativeУ мужика есть лодка, в которую, кроме самого мужика, может поместиться только один предмет — или волк, или козел, или капуста.
Если крестьянин оставит волка с козой без присмотра, волк съест козу; Если фермер оставит без присмотра козу с капустой, коза съест капусту.
В этой статье мы попытаемся найти обобщенное решение этого типа головоломки и для этого воспользуемся алгебраическими эффектами.Начнем с самого простого – маршрута путешествия.
Поскольку мы заранее не знаем, за какое гарантированное количество шагов мы получим решение, мы можем построить бесконечный маршрут, но будем все равно лениво его вычислять:
Поскольку мы собираемся строить обобщенное решение, то абстрагируемся и от персонажей.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
-
Корпоративный Штрейкбрехер
19 Oct, 24 -
Веб-Приложение Размером С Пигмея
19 Oct, 24 -
Web2.0, Редизайн И Virustotal.com
19 Oct, 24