Критика Scala
http://overwatering.org/blog/2013/12/scala-1-star-would-not-program-again/
Язык с нормальным балансом статических проверок типов и динамической типизации вида "нахрен объекты, используем мапы" наверно, еще не скоро появится.
Язык с нормальным балансом статических проверок типов и динамической типизации вида "нахрен объекты, используем мапы" наверно, еще не скоро появится.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
Правильно говорить — "биполярное аффективное расстройство типизации".
no subject
Мапы ещё хорошо бы иерархические, с переименованием, с синонимами, с ну и т.д.
no subject
не знаю, что там из этой затеи вышло
no subject
или контракты тривиальные типа бинарной сортировки и их в продакшене особо негде применить
или они сложно и долго вычисляются-проверяются и тормозят
и они делают бизнес-код жёстким, что совершенно ломает аджайл
no subject
А язык с полным, а не кастрированным, глобальным выводом типов не подойдёт?
no subject
no subject
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
no subject
no subject
http://caml.inria.fr/pub/docs/manual-ocaml-400/manual006.html#toc36
no subject
no subject
no subject
no subject
type A = {x: int; y: float};;
type B = {x: int; y: float};;
let var = {x = 5; y = 6.0};;
no subject
Пересечения по полям записей вроде бы разрулили в последних версиях, но я не смотрел подробно. Там то ли по типам записи, то ли по типам того, что присовываем в качестве значений полей. Но не уверен, пока у меня работа на старом окамле, 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).
no subject
Остальные варианты не очень, потому что где-то в коде может быть объявлена запись и при совпадении будет очень муторно искать, где совпало.
no subject
no subject
А если нужно реально гетерогенное, без предварительных объявлений типов, можно скатиться в контролируемую (не "распространяющуюся как зараза по исходнику", в смысле) динамическую типизацию, есть у меня библиотечка cadastr.
(кстати, у камлоёбов есть чятик ocaml на conference.jabber.ru.)
no subject
no subject