November 30th, 2012

with Cat The Cat

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

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

Это не так.

Сигнатура (>>=) :: 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.
with Cat The Cat

Интересная штука.

K: A Rewriting-Based Framework for Computations.

Чем интересна - описывается семантика программ через переписывание термов (term rewriting). И у меня есть воздушное такое ощущение, что можно показывать компиляцию программ из одного языка в другой следующим образом: compile_triple(S, TA, Q) -> TB iff execute_A(S, TA, Q) = execute_B(predicate_transform_AB(S), TB, predicate_transform_AB(Q)).

Вот ещё на закуску. Компиляция функционального языка в машинный код (с распределением регистров даже) через переписывание термов.