metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2013-12-02 04:50 pm

Критика Scala

http://overwatering.org/blog/2013/12/scala-1-star-would-not-program-again/
Язык с нормальным балансом статических проверок типов и динамической типизации вида "нахрен объекты, используем мапы" наверно, еще не скоро появится.

[identity profile] zerthurd.livejournal.com 2013-12-02 02:28 pm (UTC)(link)
В ерланге разве не так?

[identity profile] permea-kra.livejournal.com 2013-12-02 02:38 pm (UTC)(link)
В эрланге, можно сказать, нет статики.

[identity profile] zerthurd.livejournal.com 2013-12-02 03:10 pm (UTC)(link)
Dialyzer жи есть

[identity profile] jakobz.livejournal.com 2013-12-03 07:29 am (UTC)(link)
А как оно на практике? Мне не очень понятно как такая штука может нормально работать в языке с let-it-crash философией. Как определить специально в конкретной строчке собираются упасть или нет?

[identity profile] zerthurd.livejournal.com 2013-12-03 08:12 am (UTC)(link)
Типизация имеет такое же отношение к let-it-crash, как и к чтению из TCP. Как определить специально в конкретной строчке собираются прочесть 0x14 или 0x88?

[identity profile] zerthurd.livejournal.com 2013-12-03 08:15 am (UTC)(link)
А диалайзер на практике используется очень хорошо. Определяешь функцию, и если захотел её усилить типами, пишешь тайпспеку. Диалайзер может сам вывести тип для локальных функций, а можно ему подсказать, если функция внешняя и диалайзер не знает, как её будут использовать. Сначала диалайзер делает plt-файл, куда включаются все зависимости, которые не будут меняться в коде, это занимает достаточно много времени, несколько минут. Потом его можно быстро запускать после каждой компиляции или перед коммитом и он показывает несоответствия типов.

[identity profile] mehanizator.livejournal.com 2013-12-02 02:41 pm (UTC)(link)
груви?

[identity profile] http://users.livejournal.com/_windwalker_/ 2013-12-20 10:55 pm (UTC)(link)
тормозит

[identity profile] aamonster.livejournal.com 2013-12-02 02:41 pm (UTC)(link)
А нет нормального баланса. Это как при маниакально-депрессивном психозе: в маниакальной фазе используете максимум статической типизации, в депрессивной - мапы, и код с другой фазы выбешивает.

[identity profile] berezovsky.livejournal.com 2013-12-02 02:50 pm (UTC)(link)
Маниакально-депрессивная типизация.

[identity profile] nivanych.livejournal.com 2013-12-03 12:00 pm (UTC)(link)
Это название считается устаревшим.
Правильно говорить — "биполярное аффективное расстройство типизации".

[identity profile] juan-gandhi.livejournal.com 2013-12-02 03:54 pm (UTC)(link)
Он как-то упустил момент, а что он будет использовать вместо скалы. Судя по тому, что на на Thoughtwork работает - джаву, наверное. Good luck.

Мапы ещё хорошо бы иерархические, с переименованием, с синонимами, с ну и т.д.

[identity profile] clayrat.livejournal.com 2013-12-02 04:06 pm (UTC)(link)
Бенжамин Пирс (который TAPL написал) предлагал contracts пару лет назад
не знаю, что там из этой затеи вышло

[identity profile] volodymir-k.livejournal.com 2013-12-02 05:33 pm (UTC)(link)
с контрактами уже давным давно всё ясно -- от эйфеля до клу
или контракты тривиальные типа бинарной сортировки и их в продакшене особо негде применить
или они сложно и долго вычисляются-проверяются и тормозят
и они делают бизнес-код жёстким, что совершенно ломает аджайл
ext_646638: (Default)

[identity profile] rdia.livejournal.com 2013-12-03 02:56 am (UTC)(link)
> Язык с нормальным балансом статических проверок типов и динамической типизации вида "нахрен объекты, используем мапы" наверно, еще не скоро появится.

А язык с полным, а не кастрированным, глобальным выводом типов не подойдёт?

[identity profile] blackyblack.livejournal.com 2013-12-03 04:54 am (UTC)(link)
А он гетерогенные списки умеет?
ext_646638: (Default)

[identity profile] rdia.livejournal.com 2013-12-03 05:42 am (UTC)(link)
Смотря в каком смысле, но вот это:

type hetero = Id of int | Weight of float | None of unit;;

let lst = (Id 8)::(Weight 88.82)::(Weight 33.3)::(None ())::(Id 234)::[];;

List.map
(fun x ->
match x with
| Id i -> Printf.printf "%d " i
| Weight w -> Printf.printf "%f " w
| None () -> Printf.printf "_ ") lst;;

Printf.printf "\n";;

компилируется и выдаёт

8 88.820000 33.300000 _ 234

[identity profile] blackyblack.livejournal.com 2013-12-03 05:57 am (UTC)(link)
Вполне. А вот если есть тип А = {Int, Float} и тип B = {Int, Float}, то камл к какому типу будет значение приводить?

[identity profile] blackyblack.livejournal.com 2013-12-03 07:30 am (UTC)(link)
Синтаксис всё адовее и адовее. Угловые скобочки повылезали, квадратные + угловые и обратный апостроф.

[identity profile] gds.livejournal.com 2013-12-03 08:04 am (UTC)(link)
синтаксис отражает семантику. Всё, что повылезало в примере, требуется для весьма продвинутой типизации, а её никто не заставляет использовать.

[identity profile] gds.livejournal.com 2013-12-03 07:06 am (UTC)(link)
в каком смысле {Int, Float}?

[identity profile] blackyblack.livejournal.com 2013-12-03 07:24 am (UTC)(link)
Ну в смысле:

type A = {x: int; y: float};;
type B = {x: int; y: float};;

let var = {x = 5; y = 6.0};;

[identity profile] gds.livejournal.com 2013-12-03 07:37 am (UTC)(link)
полностью одинаковые записи делать нет практического смысла.
Пересечения по полям записей вроде бы разрулили в последних версиях, но я не смотрел подробно. Там то ли по типам записи, то ли по типам того, что присовываем в качестве значений полей. Но не уверен, пока у меня работа на старом окамле, 3.12.1, а эти изменения -- уже 4ая версия (или только хотели в 4ую пихать? не знаю.).
Тем не менее, плохой тон, можно запутаться. Лучше ax ay / bx by, если записи разные.
Можно параметризовать запись, "type ('x, 'y) myrecord = { x : 'a ; y : 'b }", если по смыслу надо иметь разные типы.
Если же смысл/назначения x и y одинаковый, но хочется иметь структурную подтипизацию (добавлять-удалять поля), можно использовать записи со структурной подтипизацией, они есть в окамле, только какие-то уроды назвали их "объекты". Например, < x : int ; y : float ; z : bool > доводится до < x : int ; z : bool > (кое-где автоматически, кое-где через compile-time coercion).

[identity profile] blackyblack.livejournal.com 2013-12-03 07:42 am (UTC)(link)
Параметризация катит.
Остальные варианты не очень, потому что где-то в коде может быть объявлена запись и при совпадении будет очень муторно искать, где совпало.

[identity profile] gds.livejournal.com 2013-12-03 08:01 am (UTC)(link)
ну, разные случаи бывают, иногда и другие варианты хороши.

[identity profile] gds.livejournal.com 2013-12-03 07:05 am (UTC)(link)
а ещё можно оформлять гетерогенное в смысле операций, которые требуются от элементов. Например, если хочется их в строку оформлять: https://gist.github.com/gdsfh/e274ec730563a77905ab (ну, объекты там не обязательны, но при расширении идеи на реальные задачи они весьма желательны)
А если нужно реально гетерогенное, без предварительных объявлений типов, можно скатиться в контролируемую (не "распространяющуюся как зараза по исходнику", в смысле) динамическую типизацию, есть у меня библиотечка cadastr.
(кстати, у камлоёбов есть чятик ocaml на conference.jabber.ru.)

[identity profile] stas binko (from livejournal.com) 2013-12-03 06:33 pm (UTC)(link)
Вы core.typed не смотрели на этот счет? Как впечатления если да?

[identity profile] metaclass.livejournal.com 2013-12-03 06:53 pm (UTC)(link)
Не, не смотрел, пока руки не дошли.