metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-08-07 07:00 pm
Entry tags:

Функциональный язык с расширяемыми записями

А вот что у нас есть из функциональщины со статической типизацией, но чтобы типы записей не нужно было объявлять заранее вообще, но при этом они бы свободно участвовали в выводе типов?

Очень уж удалбывает при работе с БД и оперденями необходимость объявлять типы. Использовать кортежи неудобно - без имен не поймешь что где в кортеже из 20-30 полей.
Приходится использовать кложурь и мапы с keyword-ключами и следить за собственной головой при рефакторингах, чтобы не поломать все нахрен, т.к. проверок статических там вообще никаких нет.

В LINQ в C# мы можем сделать анонимный класс с именованными полями, но вроде не можем вернуть его из функции и использовать где-попало за пределами текущей области видимости.
В F# ад и содомия - записи нужно объявлять заранее, что дичайше огорчает при рефакторинге - приходится бегать между объявлением и тыщами мест создания записей.
В хаскеле записи вообще, похоже, срачеразжигающая тема и ни одно из расширений вроде не считается общепринятым.

PS: Язык должен быть с иммутабельностью, хотя бы как в clojure и со статической типизацией. Зачем вы жабаскрипт вспоминаете, если я явно написал, что clojure напрягает отсутствием статического анализа кода?

[identity profile] thedeemon.livejournal.com 2012-08-08 05:58 am (UTC)(link)
Я ему:
let show x = Printf.printf "Name: %s, Age: %d, Mad: %b" x#name x#age x#mad;;
let oleg =   object method name = "Oleg"   method age = 42 method mad = true end;;
let oksana = object method name = "Oksana" method age = 21 end;;
show oleg; show oksana;;

а он мне:
File "main.ml", line 114, characters 16-22:
Error: This expression has type < age : int; name : string >
       but an expression was expected of type
         < age : int; mad : bool; name : string; .. >
       The first object type has no method mad

Статическая утиная типизация в действии. окамл.