metaclass: (Default)
[personal profile] metaclass
А вот что у нас есть из функциональщины со статической типизацией, но чтобы типы записей не нужно было объявлять заранее вообще, но при этом они бы свободно участвовали в выводе типов?

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

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

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

Date: 2012-08-07 04:03 pm (UTC)
From: [identity profile] denisioru.livejournal.com
наброшу, пожалуй. Javascript :))))))))

А если по теме C# - есть dynamic жэ. Я даже видел ORM на этом.

Date: 2012-08-07 04:09 pm (UTC)
From: [identity profile] brainsucker.livejournal.com
javascript +1

Date: 2012-08-07 04:11 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Жабаскрипт это артуреговщина, годится только для ублажения похоти вагинальных гуманитариев.
Там же ад внутри и никакой статической типизации и иммутабельности.

Date: 2012-08-07 04:41 pm (UTC)
From: [identity profile] clayrat.livejournal.com
есть такая затея:
http://roy.brianmckenna.org/

Date: 2012-08-07 05:37 pm (UTC)
From: [identity profile] victorgr.livejournal.com
Opa!

...он включает в себя полную реализации всего стека возможностей JavaScript, расширенных поддержкой статической типизации и обеспечивающий полную поддержку Node.js и MongoDB...

...данный фреймворк также может использоваться в качестве самостоятельного языка программирования: приложение, будучи написанным на Opa, будет автоматически проверено на качество его кода, после чего может быть автоматически сгенерировано аналогичное по функциональности Javascript-приложение....

Date: 2012-08-07 04:05 pm (UTC)
From: [identity profile] denisioru.livejournal.com
По сути, те же слово "dynamic" это синтаксический сахар. Внутри оно dictionary[string,object] во всеми вытекающими.
Edited Date: 2012-08-07 04:05 pm (UTC)

Date: 2012-08-07 04:05 pm (UTC)
From: [identity profile] gds.livejournal.com
дык окамл же. Только там расширяемые записи называются объектами почему-то, но это не суть важно.

Date: 2012-08-07 04:07 pm (UTC)
From: [identity profile] palm-mute.livejournal.com
в Скале есть structural typing

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

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

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

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

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

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

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

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

println(x.name)

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

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

Date: 2012-08-07 04:36 pm (UTC)
From: [identity profile] xeno-by.livejournal.com
Тайп провайдеры не канают?

Date: 2012-08-07 07:25 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ленюсь студию до 2010 обновлять, а F# 3.0 вроде только для нее?

Date: 2012-08-07 08:56 pm (UTC)
From: [identity profile] xeno-by.livejournal.com
Не знаю, если честно.

Date: 2012-08-07 04:57 pm (UTC)
From: [identity profile] ko444evnik.livejournal.com
в шарпе еще можно с туплами поиграться. она в отличие от анонимного класса не запечатана и от нее можно наследоваться. и получить к тому же кортежу альтернативный именованный доступ.

Date: 2012-08-07 07:18 pm (UTC)
From: [identity profile] veremeenko-alex.livejournal.com
Так статической типизации не получится.

metaclass хочет динамически создать тип например так:

... select new { Upper = w.ToUpper(), Lower = w.ToLower() };

И потом везде по коду пользоваться как статическим - item.Upper;


Весь дотнет стек ему похоже не поможет.

Date: 2012-08-07 05:47 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
В цацкеле можно применить трюк associated type sinonyms. Примерно так (синтаксис мог наврать)
{-# Language TypeFamilies #-}

class HasName hn where
 type NameOf hn :: *
 getName :: hn -> NameOf hn
 setName :: hn -> NameOf hn -> hn

instance HasName String  where
 type NameOf hn = String
 getName = id
 setName _ n = n



Но генерить это руками - это печаль.

Date: 2012-08-07 06:36 pm (UTC)
From: [identity profile] stdray.livejournal.com
а как далеко надо анонимные типы пробросить?

Date: 2012-08-07 06:38 pm (UTC)
From: [identity profile] osdm.livejournal.com
А что мешает генерировать типы по БД автоматом? Ровно для этой цели ORM-ы придумали, их к C# тучи.

Date: 2012-08-07 07:36 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ну CRUD, селекты с фильтрами и обертки для произвольных SQL запросов я и так генерю.

Осталось вспомнить, почему я это не использую в связке с F# - что-то там было совсем уж дикое, то ли синтаксис от версии к версии менялся, то ли поддержка БД была совсем уж условная.

Date: 2012-08-08 04:04 am (UTC)
From: [identity profile] nivanych.livejournal.com
Мешает то, что для статической проверки тут надо зависимые типы, ибо всё-всё не перегенеришь, вариантов очень много.
Можно сгенерить правильные туплы или record'ы под всю строчку такой-то таблицы.
Но бывают и SELECT'ы, задействующие не все столбцы таблицы, ну и это можно побороть.
А бывают ещё и всякие функции типа агрегатов. Итипатого.

Date: 2012-08-07 06:47 pm (UTC)
From: [identity profile] levgem.livejournal.com
наверное нужно, что бы статический язык имел возможность быстро и грязно чем угодно генерироваться.
Т.е. на старте запускаемся, коннектимся к БД, ищем описание таблицы, генерируем код, потом дергаем ручку, компилим и дальше всё чисто статически.

Date: 2012-08-07 07:38 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Вообще, clojure так делает, но к ней статик анализ и вывод типов приделывать - это сдохнуть.

Date: 2012-08-08 04:05 am (UTC)
From: [identity profile] nivanych.livejournal.com
Template Haskell тогда...
Он не очень страшный, изучить недолго...

Date: 2012-08-07 08:25 pm (UTC)
From: [identity profile] thesz.livejournal.com
HList: http://hackage.haskell.org/package/HList-0.2.3

http://hackage.haskell.org/packages/archive/HList/0.2.3/doc/html/Data-HList-Record.html

Имена полей можно переиспользовать, а в типе функции от записей требуется только содержать необходимые поля. Вкупе с Constraint Kinds должно получиться хорошо.

Date: 2012-08-07 09:13 pm (UTC)
From: [identity profile] triampurum.livejournal.com
Ur/Web (http://blog.ezyang.com/2012/07/polymorphic-variants-in-urweb/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+ezyang+%28Inside+245s%29).

Date: 2012-08-08 01:38 am (UTC)
From: [identity profile] qehgt.livejournal.com
Хм.... А разве DBML + LINQ to SQL - это не то, что надо? Накидал таблиц, оно по ним классы сгенерировало, после этого на этапе компиляции всё проверяется.

Или тебе не для БД, а "вообще"?

Date: 2012-08-08 03:47 am (UTC)
From: [identity profile] qehgt.livejournal.com
Да, в F# 3.0 есть "type providers", возможно, это именно то, что ты ищешь.

Date: 2012-08-08 05:58 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Я ему:
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

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

Date: 2012-08-08 06:20 am (UTC)
From: [identity profile] berezovsky.livejournal.com
обсудите eval в следующем набросе

Date: 2012-08-08 09:08 am (UTC)
From: [identity profile] Игорь Петров (from livejournal.com)
SML
gist.github.com/2964305
Также:
hackage.haskell.org/package/has
Пока нужно объявлять поля, но в новых ghc есть типы-строки, которые эту проблему устраняют.

Date: 2012-08-08 10:26 am (UTC)
From: [identity profile] Денис Степаненко (from livejournal.com)
Nemerle?

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 14th, 2025 09:37 pm
Powered by Dreamwidth Studios