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] 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)
ну, разные случаи бывают, иногда и другие варианты хороши.