Да, в JVM нельзя руками управлять памятью. Она не для того. Если в задаче требуется ручное управление памятью (что на данный момент имеет смысл только в embedded-приложениях и массивно-параллельных задачах а-ля CUDA), то лучше взять что-нибудь другое.
Mutually recursive обычно слабо. Но там, где нужно mutually recursive, лучше подумать и сделать как-нибудь ещё. Кроме чисто математических генераторов последовательностей, ни разу взаимная рекурсия мне не пригождалась.
«Слишком навороченный синтаксис» при рассмотрении становится достаточно регулярным. Я бы сказал, он примерно на уровне самой джавы. Сложнее хаскеловского, конечно, но вполне сравним с синтаксисом какого-нибудь окамла. Я уж не говорю о ужасах вроде C++. Разумеется, скобочники вообще синтаксическое богатство и экспрессивность на дух не переносят, но на то они и скобочники. Я вырос на перле, меня синтаксисом не напугаешь. И ООП, кстати, тоже, потому что я в своё время писал персистентную объектную модель а-ля Gemstone/S на перле. Подумаешь, скала.
А система типов сложная, да. Но, во-первых, никто не заставляет активно пользоваться всем, что в ней есть (в том виде, в которой ей пользуюсь я, она точно не сложнее хаскелевской). А во-вторых, никогда не знаешь, когда тебе пригодятся навороты. Вот скоро type providers доделают, а они мне очень нужны. И dependent object types тоже.
>Если в задаче требуется ручное управление памятью (что на данный момент имеет смысл только в embedded-приложениях и массивно-параллельных задачах а-ля CUDA), то лучше взять что-нибудь другое.
Не ручное управление памятью, а оптимизация её использования. Я привёл пример с IntMap. Оперативной памяти всегда не хватает, во всех приложениях.
>Mutually recursive обычно слабо. Но там, где нужно mutually recursive, лучше подумать и сделать как-нибудь ещё. Кроме чисто математических генераторов последовательностей, ни разу взаимная рекурсия мне не пригождалась.
Взаимная рекурсия позволяет безопасно использовать несводимые циклы (irreducible loops). Они становятся столь же приятными, как и обычные структурные циклы. Таким образом, помимо лишения себя выразительной возможности, вы ещё и заставляете себя напрягаться.
Вот пример, где это может пригодиться, и не являющийся генератором последовательностей:
-- |Parse something zero or more times.
pMany p = pMany1 p !++ return []
pMany1 p = do
x <- p
xs <- pMany p
return $ x:xs
Как я и говорил, во взглядах на объективную действительность мы совпадаем, а во вкусах, предпочтениях и оценках расходимся. Так что спора не получается. :)
Свои тезисы относительно Scala и соображения в их поддержку я уже высказал, при этом так и написал, что ты со мной едва ли согласишься. ;) Ты высказал свой взгляд и свои аргументы, так что у singalen теперь есть более объёмная картина Scala и окрестностей. Спасибо что откликнулся и привнёс свою перспективу! :)
(no subject)
11/7/12 07:24 (UTC)Mutually recursive обычно слабо. Но там, где нужно mutually recursive, лучше подумать и сделать как-нибудь ещё. Кроме чисто математических генераторов последовательностей, ни разу взаимная рекурсия мне не пригождалась.
«Слишком навороченный синтаксис» при рассмотрении становится достаточно регулярным. Я бы сказал, он примерно на уровне самой джавы. Сложнее хаскеловского, конечно, но вполне сравним с синтаксисом какого-нибудь окамла. Я уж не говорю о ужасах вроде C++. Разумеется, скобочники вообще синтаксическое богатство и экспрессивность на дух не переносят, но на то они и скобочники. Я вырос на перле, меня синтаксисом не напугаешь. И ООП, кстати, тоже, потому что я в своё время писал персистентную объектную модель а-ля Gemstone/S на перле. Подумаешь, скала.
А система типов сложная, да. Но, во-первых, никто не заставляет активно пользоваться всем, что в ней есть (в том виде, в которой ей пользуюсь я, она точно не сложнее хаскелевской). А во-вторых, никогда не знаешь, когда тебе пригодятся навороты. Вот скоро type providers доделают, а они мне очень нужны. И dependent object types тоже.
(no subject)
11/7/12 10:26 (UTC)Не ручное управление памятью, а оптимизация её использования. Я привёл пример с IntMap. Оперативной памяти всегда не хватает, во всех приложениях.
>Mutually recursive обычно слабо. Но там, где нужно mutually recursive, лучше подумать и сделать как-нибудь ещё. Кроме чисто математических генераторов последовательностей, ни разу взаимная рекурсия мне не пригождалась.
Взаимная рекурсия позволяет безопасно использовать несводимые циклы (irreducible loops). Они становятся столь же приятными, как и обычные структурные циклы. Таким образом, помимо лишения себя выразительной возможности, вы ещё и заставляете себя напрягаться.
Вот пример, где это может пригодиться, и не являющийся генератором последовательностей:
(no subject)
12/7/12 14:30 (UTC)Свои тезисы относительно Scala и соображения в их поддержку я уже высказал, при этом так и написал, что ты со мной едва ли согласишься. ;) Ты высказал свой взгляд и свои аргументы, так что у
(no subject)
12/7/12 14:50 (UTC)Жаль, что совершенства в мире нет.