Здравствуйте, alex_public, Вы писали:
_>И в чём несодержательность то? )
Сравните:
liftM2 :: Monad m => (a -> a1 -> b) -> m a -> m a1 -> m b
и
template<template<class>class M, typename R, typename T1, typename T2>
function<M<R>(M<T1>,M<T2>)> liftM2(R (*f)(T1, T2))
Во втором случае (на псевдоплюсах) нигде не написано, что это за M. Использование >>= никак не отражено в сигнатуре. Вот про это я и говорил "нетипизировано" и "несодержательная сигнатура"
_>Писать то можно... Только кто это делает? )
Все делают. В том же Rx множество комбинаторов, для которых никакого спецсинтаксиса нет.
_>Почему я вижу определение грамматики через select, where и т.п.? )
Отлично, мы вернулись на несколько постов назад. Мне скопипастить свой ответ или сами прочитаете?
_>Суть в том, что на практике монады как раз нужны достаточно редко.
Т.е. возвращать из функций вида a -> m b и передавать в другие — это все-таки редко нужно, я правильно понял?
_>А их частое использование в Хаскеле всего лишь следствие некоторых неудобностей языка
Ну так назовите хоть одну. Что это за "неудобности" такие, которые вынуждают в хаскеле монады использовать, и которых в другом языке нет и использовать монады ничто не вынуждает.
Вы раз за разом повторяете, что они есть, но назвать ни одной не можете.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll