Ещё один взгляд на монады.

Nov 30, 2012 16:37

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

Это не так.

Сигнатура (>>=) :: m a -> (a -> m b) -> m b означает, что присутствует связывание возвращённого методом значения с параметром, в зависимости от которого вычисляются последовательность вызовов других методов.

Да, внешне монада выглядит очень похоже на LinQ:
from table
select $ \(x, y, z) -> x
check $ \x -> x > 1 -- where is a keyword.

table.Select((x,y,z) => x).Where (x => x > 1);

Разница вот в этом:
from table
currentX <- select $ \(x, y, z) -> x
if x > 1 then return x else fail "miserably."

Для списков fail возвращает пустой список и ничего не произойдёт. Для какой-нибудь БД монады можно сделать такой fail, что будет переходить к следующему элементу по курсору. Это полностью аналогично Where, только мощнее.

Переводя всё обратно на SQL, это как если бы части SQL запроса менялись в зависимости от данных, выбранных и обработанных до этого.

И даже и не знаю, что ещё можно сказать тут. ;)

LinQ и цепочечный вызов методов больше похожи на обычное применение функции, только наоборот:
x !$ f = f x -- |> in other languages, I presume.
result = from table !$ select (\(x,y,z) -> x) $! check (\x -> x > 1)

Это даже не Applicative.

монады, страшное, Хаскель

Previous post Next post
Up