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] palm-mute.livejournal.com 2012-08-07 04:07 pm (UTC)(link)
в Скале есть structural typing

[identity profile] metaclass.livejournal.com 2012-08-07 04:15 pm (UTC)(link)
Ага, вроде-то что-то похожее, надо взглянуть.

[identity profile] zhengxi.livejournal.com 2012-08-07 04:29 pm (UTC)(link)
И еще вот: http://www.scala-lang.org/api/current/scala/Dynamic.html

[identity profile] golikov konstantine (from livejournal.com) 2012-08-08 12:29 am (UTC)(link)
Динамик все равно нужно куда-то подмешивать а потом долго писать что и как (какие методы вызывать при "отсутствии")

По моему намного проще настругать обертку на кейс классах, аля

case class UserRecord(id: Long, name: String, login: String)

и дальше ее спокойно использовать при создании как

val x = UserRecord(10, "Теодор", "unabomber")

и использовании как:

println(x.name)

[identity profile] red1ynx.livejournal.com 2012-08-07 06:21 pm (UTC)(link)
+1 к scala.

[identity profile] golikov konstantine (from livejournal.com) 2012-08-07 07:06 pm (UTC)(link)
только он жутко тормозной, потому что, насколько я знаю, это рефлекшн обмазанный рефлекшеном