Здравствуйте, alex_public, Вы писали:
_>Интересно, тогда что это у нас, например здесь http://ru.wikipedia.org/wiki/Singleton#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D0.BD.D0.B0_C.23?)
То, про что я сказал двумя ответами выше. "Без метапрограммирования никаких шаблонов проектирования в коде нет — только результат их применения в голове программиста. Поэтому к уровню кода они никакого значения не имеют."
В приведенном вами примере по ссылке метапрограммирование используется, так о чем мы все-таки говорим?
_>Хы, ну если заменить слово монада на слово процедура, то классический ООП код тоже спокойно будет попадать под такое определение. )))
Нет, потому что про монады, моноиды, функторы, категории можно что-то сказать, как-то определить, у них и свойства есть, так что можно рассуждать о коде. А "процедура" это то же что и "сепулька". Сказать про нее с определенностью ничего нельзя, каких-то свойств у нее нет.
_>Угу, угу. аналога написать нельзя, но пользы от этого не имеющего аналогов нет. Я приблизительно так себе и представлял... )
В данном случае разговор о том, что аналог написать нельзя — только и всего.
_>Польза в виде борьбы с проблемами, вызванными неудачным дизайном язык — это конечно очень интересно. )))
Неудачность дизайна вовсе ниоткуда не следует. Вы ее вводите исключительно потому, что в плюсах дизайн совсем другой, ну и для оправдания монадофобии. Иммутабельность как прием вполне полезна и рекомендуется даже в языках, где вовсе никак не поддерживается (т.е. с дизайном "удачным" по вашему, иммутабельность не поощряющем). В хаскеле она поддерживается, в том числе имеются и обсуждаемые средства уменьшения издержек.
_>Ууу, там много всего. Хотя первоисточник проблемы общий. Ну если взять этот наш конкретный код... Как насчёт записать его в виде чего-то типа "M.write a 1 (M.read a 1)^2"? )
Вы все таки имеете в виду
M.write a 1 (M.read a 1 ^2)
-- или
M.write a 1 $ M.read a 1 ^2
ну, как сделать ^2 я уже писал в соседних ветках, а $ заменяется на =<< и получаем
M.write a 1 =<< M.read a 1 ^2
синтаксические затраты на лифтинг безусловно есть, я их не отрицаю, я утверждаю, что они компенсируются синтаксической легковесностью остального. Т.е. применений и определений функций, лямбд, сечениями, паттерн мэтчингом и т.д.
К примеру, можно определить функцию
over v i f = M.write v i =<< f (M.read v i)
и писать
over v 1 (^2)
'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