Alexander
и все будет
Alexander
(бан за наглую рекламу)
Artyom
невозможно :( мб в следующем году разве что
Artyom
ну вот, the Артёма забанили
о кстати, а за что меня забанили?
Artyom
ко мне какой-то терминатор пришёл и две пилюли предложил, я ткнул в рандомную
Yura
так я смотрю @qnikst тоже в _blah скатывается :D
Alexander
@drcha0s но есть же стериотипы, что это работает
Yura
дык я не против!
Alexander
могу убить, я решил, что раз у меня получилось что-то типа совета то можно и пошутить
Yura
ненене
Yura
я шутил
Alexander
все шутят fix шутка
Andrey
неидеальный мир
Artyom
все шутят fix шутка
это уже две шутки я запомню, что с тебя ещё совет
Alexander
Артему вроде нужна же динамическая инфа?
Alexander
вообще был source-graph
Artyom
не, статическая как раз
Artyom
Alexander
не уверен, что он живой
Alexander
вроде лет 6 назад у меня он валился на моих проектах
Alexander
https://hackage.haskell.org/package/SourceGraph
Alexander
ура, второй совет сработал
Alexander
(надеюсь это за шутку не считается)
Cheese
какого?
Казака. он таки вернулся
Alexander
а как мы с ним разговариваем?!
Cheese
не знаю. почему-то сообщение о присоединении исчезло, как это обычно бывает, если терминатору не ответить
Alexander
в логах вижу бан а потом бот все вернул
Anonymous
От железного чурбана есть какой-то прок?
Andrey
есть, конечно, раз распознал как надо
Alexander
ну ботов стало меньше, не знаю он или статистик помогли
Anonymous
Он не самый хлебо-сольный. Неприветливый. Неочевидно, которую кнопку нужно жать. Стресс нагоняет, не?
Alexander
ну давайте бота психолога ещё добавим
Anonymous
Да я переживу. За психологией лучше к людям. Что значит: "идём со мной", не понял. Но в голове моей опилки, так что ничего удивительного.
Alexander
вообще вопрос не очевидный
Alexander
"ты хочешь знать о Haskell" с ответами да/нет было бы проще
Alexander
или да/да
Alexander
и оба правильные
Anonymous
А сейчас который ответ правильный? Или уже оба?
Alexander
без понятия
Alexander
мне очень не нравился подход в persistent где мы отдельно храним ключ и значение для типа
Alexander
но с другой стороны это позволяет переиспользовать код для insert, когда id-шника ещё нет
Alexander
а есть, какие-нибудь другие адекватные подходы позволяющие code reuse, и не хранить data KeyValue или аналогичный тип
Alexander
и желательно не как в opaleye с Foo a b где для Id я поидее могу подставить ()
Alexander
и как бы сделать композабельным hasql
Anonymous
Wrong Number будет жить. Поприветствуем!
Dmitry
а есть, какие-нибудь другие адекватные подходы позволяющие code reuse, и не хранить data KeyValue или аналогичный тип
другие, конечно, есть. Адекватные ли - вопрос неясный. Если интересно, можно мои труды посмотреть github.com/odr/db-schema.
Alexander
а в кратце сделано, я не уверен, что я готов эту либу тащить прямо сейчас
Alexander
ну или хотя бы куда стоит начинать смотреть
Dmitry
я бы предложил начать с app - там какой-то пример
Dmitry
работает только с sqlite, pg не приделывал
Dmitry
делаешь простые рекорды, описывающие таблицы. К ним добавляется TL инфо о pk, fk, uk. Прогоняется через TH. Получаются классы с информацией о схеме БД на уровне типов, и на уровне значений.
Dmitry
Можно сгенерировать БД, как в persistent (без modify). Можно делать DML. Можно сделать другие рекорды - проекции и через них работать. Можно в проекции добавить списки дочерних рекордов и DML их сразу целиком. Ключи будут на лету генерироваться
Dmitry
в общем, с app, мне кажется, можно разобраться. Главное достижение, что оно компилируется вроде приемлемо по времени
Alexander
обидно coerce не находит само путь между нужными типами без подсказок
Cheese
мне очень не нравился подход в persistent где мы отдельно храним ключ и значение для типа
нет, там не обязательно хранить отдельно, можно только сказать персисту, какое поле у тебя первичный ключ
Alexander
Какой именно патч?
https://github.com/bos/pool/pull/21
Alexander
нет
Andrei
https://hackage.haskell.org/package/beam
Andrei
я не гарантирую, что это именно то, что нужно, но а вдруг
Alexander
я кстати знаю скорее всгео что я хочу
Alexander
но я это ещё не написал
саша
Кстати, а сахарок в хаскеле будет для экзистенциальных типов когда-нибудь? Или может он в каких расширениях есть? Что бы как в русте impl Trait
Big Bux Chungus
мой вариант: {-# LANGUAGE ExistentialQuantification, ConstraintKinds, KindSignatures #-} module Main where import GHC.Exts (Constraint) data Instance (c :: * -> Constraint) = forall a. c a => Instance a a :: Instance Eq a = Instance 1
Artyom
ещё это обычно называется Some или Exists (их несколько живёт на Hackage) https://hackage.haskell.org/package/exists-0.2/docs/Data-Exists.html
Cheese
может, какой-то другой сахарок нужен?
A64m
class Show a => Foo a where baz :: a -> a data Bar = Bar Int instance Foo Bar where baz x = Bar $ x * 2 bar :: instance Foo bar = Bar 1 barS :: String barS = show $ baz bar
Big Bux Chungus
data Instance (c :: * -> Constraint) = forall a. c a => Instance a instance Show (Instance Show) where show (Instance a) = show a a :: Instance Show a = Instance 1 main :: IO () main = putStrLn $ show a
A64m
ну да
Big Bux Chungus
а, хочется все инстанцы захватить?
Big Bux Chungus
это конечно никак
Big Bux Chungus
пытаюсь придумать, как написать instance c (Instance c)
Big Bux Chungus
видимо никак
A64m
почему никак? type FooBar a = (Show a, Typeable a) ... Instance FooBar ...
Cheese
ну, в других языках тоже есть разыменование ссылки, не так уж это плохо
A64m
> :set -XConstraintKinds -XGADTs -XFlexibleInstances -XUndecidableInstances -- храним неизвестный тип a с известным интерфейсом c > data Box c where Box :: c a => a -> Box c -- если известный интерфейс Show - можем печатать боксы > instance Show (Box Show) where show (Box x) = show x > [ Box 42, Box "foobar", Box 2.5 ] :: [Box Show] [42,"foobar",2.5] -- если известный интерфейс - rtti - можем извлекать из боксов значения нужного нам типа: > let boxes = [ Box 42.0, Box "foobar", Box 2.5 ] :: [Box Typeable] > mapMaybe (\(Box x) -> cast x) boxes :: [Double] [42.0,2.5] > mapMaybe (\(Box x) -> cast x) boxes :: [String] ["foobar"] -- составной интерфейс > type FooBar a = (Show a, Typeable a) > let boxes = [ Box 42, Box "foobar", Box 2.5 ] :: [Box FooBar] > map (\(Box x) -> (show x, cast x :: Maybe String)) boxes [("42",Nothing),("\"foobar\"",Just "foobar"),("2.5",Nothing)]
Big Bux Chungus
почему никак? type FooBar a = (Show a, Typeable a) ... Instance FooBar ...
да, глупость сказал. наверно ещё можно как-то через [* -> Constraint]
Big Bux Chungus
а можно instance c (Box c) написать? может deriving via как-то в помощь?