Это, кажется, называется search monad. Идея в том, что b — это вроде как "хорошесть" (в каком угодно смысле), a -> b — это "критерий" хорошести значений типа a, а (a -> b) -> a — это функция, которая по критерию ищет "наилучший" ответ (это не значит, что она его хорошо ищет).
Соответственно, return — это функция, которая всегда возвращает одно и то же. Типа стоящих часов: дважды в сутки они всё-таки дают правильный ответ
return a = Quest (\_ -> a)
А вот (>>=) интереснее. У нас есть способ находить самый лучший a, и для каждого a мы ищем наилучший c, пользуясь a как дополнительной информацией. Если дополнительная информация не ахти, то и результат мы получим, видимо, паршивый.
Значит, если у нас есть критерий на c, то мы можем сделать из него критерий на a таким образом: пусть у нас есть какой-то a; по нему мы попытаемся найти наилучший c, и посмотрим, насколько хорошо у нас получится:
comap :: (a -> Quest b c) -> (c -> b) -> (a -> b)
comap f p = \a -> case f a of Quest h -> p (h p)
Ну а раз у нас есть функция поиска на a, мы можем по этому критерию найти a, а отсюда уже недалеко и до c:
Quest h >>= f = Quest (\p -> let a = h (comap f p) in case f a of Quest j -> j p)
no subject
Date: 2015-11-06 01:10 pm (UTC)b
— это вроде как "хорошесть" (в каком угодно смысле),a -> b
— это "критерий" хорошести значений типаa
, а(a -> b) -> a
— это функция, которая по критерию ищет "наилучший" ответ (это не значит, что она его хорошо ищет).Соответственно, return — это функция, которая всегда возвращает одно и то же. Типа стоящих часов: дважды в сутки они всё-таки дают правильный ответ А вот (>>=) интереснее. У нас есть способ находить самый лучший
a
, и для каждогоa
мы ищем наилучшийc
, пользуясьa
как дополнительной информацией. Если дополнительная информация не ахти, то и результат мы получим, видимо, паршивый.Значит, если у нас есть критерий на
c
, то мы можем сделать из него критерий наa
таким образом: пусть у нас есть какой-тоa
; по нему мы попытаемся найти наилучшийc
, и посмотрим, насколько хорошо у нас получится: Ну а раз у нас есть функция поиска наa
, мы можем по этому критерию найтиa
, а отсюда уже недалеко и доc
: