metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-11-06 04:15 am
Entry tags:

Scala

Читаю книжку Одерского, до основной шизы еще не добрался, но такое ощущение, что в скале чрезмерно много синтаксического сахара. Типа "тут вы можете скобки опустить, а тут вместо скобок использовать фигурные скобки, а тут мы прямо в параметрах класса сделаем их полями, а в multiline string literal вы можете сделать отступ и stripMargin" и прочая и прочая в том же духе.
Основное из этого, видимо - function literals и вызов методов в стиле a methodName b, без точек и скобок, что делает код более лаконичным, одновременно позволяя при желании превратить код в нечитабельный ад.

Заодно по наводке [livejournal.com profile] 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

По-моему, это уже достаточно сложно, чтобы увлечь психов и стать новыми крестиками. Вот [livejournal.com profile] xeno_by еще приделает макросы - и совсем хорошо станет.

[identity profile] udpn.livejournal.com 2012-12-19 11:06 am (UTC)(link)
>> Я правильно понял, вы научились в C++ наследоваться от bool?
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 Единственная известная мне система, где полиморфная рекурсия тайпчекается, это исчисление Милнера-Майкрофта, для которого, походу, ещё даже нет доказательства разрешимости тайпчека.
Edited 2012-12-19 11:18 (UTC)

[identity profile] migmit.livejournal.com 2012-12-19 12:19 pm (UTC)(link)
> ADT Bool в С++

То есть, нет. Ясно.

> Подразумевается, что я сейчас побегу заменять ADT на композируемую систему классов типов с геттерами и сеттерами, сдабривать это Template Haskell поверх для преобразования ADT<>TC и создания инстансов, и всё это ради того, чтобы в Haskell у меня появилась вещь, которая есть в С++, O'Caml и Scala by design и никаких сложностей не вызывает?

Конечно, нет. Это вещь редко нужная, и вам, скорее всего не понадобится.

А Template Haskell - бяка.

> Ну таки там у вас ошибка, полиморфная рекурсия.

> Единственная известная мне система, где полиморфная рекурсия тайпчекается, это исчисление Милнера-Майкрофта, для которого, походу, ещё даже нет доказательства разрешимости тайпчека.

Странно, в Java пример тайпчекается, в C# тайпчекается, в Haskell тайпчекается. А вот во всяких сишечках, с плюсами и без - ну никак.

> ошибку языка: дженерики, которые не подлежат type erasure.

Ну, вот в C# нет type erasure, а пример в шарпе работает.

[identity profile] migmit.livejournal.com 2012-12-19 08:24 pm (UTC)(link)
Ну, во-первых, то, что вы обозвали словом List тип, аналогичный Maybe (a, b). То есть, само по себе это не ошибка, как хотите, так и называйте, но это очень похоже на абсолютно неправильное понимание происходящего.

Во-вторых, этот код — это, вообще, к чему?
Edited 2012-12-19 20:24 (UTC)

[identity profile] migmit.livejournal.com 2012-12-19 08:37 pm (UTC)(link)
Если вас интересует аналог моего примера на Haskell, то смотрите сюда: http://hpaste.org/79528