монада синтаксически выглядит, как вызов метода на объекте, семантически это вызов метода на объекте и ровно для этого же используется. Это не так.
Сигнатура (>>=) :: 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.