Scala
Читаю книжку Одерского, до основной шизы еще не добрался, но такое ощущение, что в скале чрезмерно много синтаксического сахара. Типа "тут вы можете скобки опустить, а тут вместо скобок использовать фигурные скобки, а тут мы прямо в параметрах класса сделаем их полями, а в multiline string literal вы можете сделать отступ и stripMargin" и прочая и прочая в том же духе.
Основное из этого, видимо - function literals и вызов методов в стиле a methodName b, без точек и скобок, что делает код более лаконичным, одновременно позволяя при желании превратить код в нечитабельный ад.
Заодно по наводке
jdevelop глянул на http://spray.io/ https://github.com/spray/spray/wiki
Примеры там, конечно, знатный abuse возможностей языка и вычислений на типах, типа extraction-директив с HList в качестве параметра типа.
Clojure по сравнению с этим выглядит более простой и логичной, хотя я не уверен, можно ли сравнивать совершенно разные языки, общего у которых только функциональщина и иммутабельность иногда.
PS: Вот, к примеру:
https://github.com/spray/spray/blob/master/docs/documentation/spray-routing/code/docs/HttpServiceExamplesSpec.scala
В SimpleService HttpResponse реализован как html-код написанный прямо внутри скала-кода.Сижу уже 30 минут ищу, где это преобразование реализовано и как. Т.е. не видя отдельных литералов и их типов (которые без загрузки всего оного кода с зависимостями в IDE/интерпретатор еще и не увидишь), с ходу догадаться, что происходит, достаточно сложно. XML literals, встроенные в язык и где-то implicit для конверсии.
PPS: implicit evidence:
http://jim-mcbeath.blogspot.com/2008/11/scala-type-infix-operators.html
http://stackoverflow.com/questions/3427345/what-do-and-mean-in-scala-2-8-and-where-are-they-documented
По-моему, это уже достаточно сложно, чтобы увлечь психов и стать новыми крестиками. Вот
xeno_by еще приделает макросы - и совсем хорошо станет.
Основное из этого, видимо - function literals и вызов методов в стиле a methodName b, без точек и скобок, что делает код более лаконичным, одновременно позволяя при желании превратить код в нечитабельный ад.
Заодно по наводке
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Примеры там, конечно, знатный abuse возможностей языка и вычислений на типах, типа extraction-директив с HList в качестве параметра типа.
Clojure по сравнению с этим выглядит более простой и логичной, хотя я не уверен, можно ли сравнивать совершенно разные языки, общего у которых только функциональщина и иммутабельность иногда.
PS: Вот, к примеру:
https://github.com/spray/spray/blob/master/docs/documentation/spray-routing/code/docs/HttpServiceExamplesSpec.scala
В SimpleService HttpResponse реализован как html-код написанный прямо внутри скала-кода.
PPS: implicit evidence:
http://jim-mcbeath.blogspot.com/2008/11/scala-type-infix-operators.html
http://stackoverflow.com/questions/3427345/what-do-and-mean-in-scala-2-8-and-where-are-they-documented
По-моему, это уже достаточно сложно, чтобы увлечь психов и стать новыми крестиками. Вот
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
no subject
уно) http://yz.mit.edu/wp/true-scala-complexity/
дос) http://www.reddit.com/r/haskell/comments/zxcks/haskell_vs_f_vs_scala_a_highlevel_language/c68ybn1
no subject
Есть куча высказываний на тему "я попытался сделать в Скале как в Хаскелле и получилась какая-то фигня". Эти высказывания многими считаются критикой Скалы. Но в обратную сторону это почему-то не работает. "Я попытался сделать в Хаскелле трейты как в Скале и получилась какая-то фигня" - такого в интернетах не видел ни разу.
no subject
no subject
no subject
no subject
no subject
От тайп инференса пришлось отказаться (см. отличные примеры с обоснованием вот тут: http://groups.google.com/group/scala-language/msg/c26eb3bd7aa58817) ради смешивания ООП и ФП. В результате можно делать вот такие вещи: https://www.precog.com/blog-precog-2/entry/existential-types-ftw. Для меня неочевидно, что этот трейдофф проигрышный.
no subject
Честное слово, после чтения я пришёл к выводу, что я стал очень далёк от OO. Я даже не понимаю формулировки проблемы, которые могут привести к таким решениям, что уж говорить про сами решения.
Во второй (которая FTW) есть хотя бы список успехов. Но таким списком я бы гордился году в 2008, примерно. Сейчас это обычное дело в проекте на Хаскеле.
no subject
no subject
Могут ли модули быть заменены записями? (подсказка: Cayenne)
no subject
Что-то такое, но я подразумевал только systems-design/architecture-часть, безотносительно менеджмента.
@ Могут ли модули быть заменены записями?
Иногда могут, иногда нет - в зависимости от того, о каких модулях и каких записях речь.
На фундаментальном уровне все эти концепции крутятся вокруг типов-произведений, экзистенциальных типов, и сабтайпинга.
Для первого приближения я себе выработал такие соответствия:
непараметризуемые модули - это приблизительно то же самое (~), что и неймспейсы;
параметризуемые модули ~ записи, умеющие содержать те же виды деклараций, что и нечто, соответствующее обычным модулям в данном языке (где сами эти записи декларируются, например);
параметризуемые модули с сабтайпингом ~ классы в ООП.
Такие аналогии классов и записей с модулями лучше чувствуются в языках, где можно импортировать начинку экземпляров записей (Agda, Cayenne) и классов (Scala) в текущий скоуп.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Я про эти успехи говорил.
no subject
no subject
no subject
Мне в хаскеле от скалы хотелось бы хотя-бы имплициты (ни в коем случае не динамический скоупинг по имени, с которым их путают, как в уже присутствующем расширении implicit parameters!), но без конверсий - а только в качестве управляемого type-directed скоупинга, для того, чтобы не протаскивать постоянно конфигурации в монадах, для замены тайпклассов, и для удобного proof-carrying, если захочется что-нибудь такое в духе агды писать.
no subject
no subject
Легко эмулируется через классы и RankNTypes.
> А на С++ с Haskell всё переводится отлично, особенно теперь, с С++11.
Что, C++11 наконец-то научился не ограничивать при компиляции количество типов в рантайме?
no subject
Расширьте мне data Bool = True | False на ещё один конструктор Uncertain. Библиотечный код не должен пострадать.
Или расширьте data Point a = Point { x : a, y : a } на z : a.
Или определите два trait'а с абстрактными типами a la Scala.
>> не ограничивать при компиляции количество типов в рантайме
Каких типов в рантайме? WTF?
no subject
Я правильно понял, вы научились в C++ наследоваться от bool?
> Или расширьте data Point a = Point { x : a, y : a } на z : a.
Я что, обещал расширять типы, на расширение не рассчитанные?
> Каких типов в рантайме? WTF?
Ну блин, вы же видели мой пост в ЖЖ. http://migmit.livejournal.com/32688.html
В рантайме могут создаваться данные различных типов, более того - неограниченного количества таковых.
no subject
ADT Bool в С++: http://ideone.com/00TLJc
Сast-constructor и implicit cast для Bool <-> bool добавить для пущей убедительности?
>> нет расширяемых ADT
>> Легко эмулируется через классы и RankNTypes.
>> data Point a = Point { x : a, y : a } на z : a.
>> Я что, обещал расширять типы, на расширение не рассчитанные?
[когнитивный диссонанс]
Подразумевается, что я сейчас побегу заменять ADT на композируемую систему классов типов с геттерами и сеттерами, сдабривать это Template Haskell поверх для преобразования ADT<>TC и создания инстансов, и всё это ради того, чтобы в Haskell у меня появилась вещь, которая есть в С++, O'Caml и Scala by design и никаких сложностей не вызывает?
>> Ну блин, вы же видели мой пост в ЖЖ. http://migmit.livejournal.com/32688.html
Ну таки там у вас ошибка, полиморфная рекурсия. Она накладывается на ошибку языка: дженерики, которые не подлежат type erasure.
UPD Единственная известная мне система, где полиморфная рекурсия тайпчекается, это исчисление Милнера-Майкрофта, для которого, походу, ещё даже нет доказательства разрешимости тайпчека.
no subject
То есть, нет. Ясно.
> Подразумевается, что я сейчас побегу заменять ADT на композируемую систему классов типов с геттерами и сеттерами, сдабривать это Template Haskell поверх для преобразования ADT<>TC и создания инстансов, и всё это ради того, чтобы в Haskell у меня появилась вещь, которая есть в С++, O'Caml и Scala by design и никаких сложностей не вызывает?
Конечно, нет. Это вещь редко нужная, и вам, скорее всего не понадобится.
А Template Haskell - бяка.
> Ну таки там у вас ошибка, полиморфная рекурсия.
> Единственная известная мне система, где полиморфная рекурсия тайпчекается, это исчисление Милнера-Майкрофта, для которого, походу, ещё даже нет доказательства разрешимости тайпчека.
Странно, в Java пример тайпчекается, в C# тайпчекается, в Haskell тайпчекается. А вот во всяких сишечках, с плюсами и без - ну никак.
> ошибку языка: дженерики, которые не подлежат type erasure.
Ну, вот в C# нет type erasure, а пример в шарпе работает.
(no subject)
(no subject)
(no subject)
no subject
no subject
object с таким же именем, как и trait, нужен для static.
abstract class + case classes нужны для расширяемых ADT (которых в Х-е нет) aka Composite pattern по GoF.
class+traits это основной способ сборки программ на Scala, посредством cake pattern. Суть простая: создаём много trait в качестве строительных единиц класса. В С++ trait известны как "стратегии Александреску". Наследование классом A трейта B в С++ выглядит как class A : B (да, CRTP).
Про функции ничего не пишу, потому что это всего лишь переменные с функциональным значением.
no subject
no subject
Там A : B<A>