Alexander
и все будет
Alexander
(бан за наглую рекламу)
Artyom
невозможно :( мб в следующем году разве что
Artyom
ко мне какой-то терминатор пришёл и две пилюли предложил, я ткнул в рандомную
Yura
так я смотрю @qnikst тоже в _blah скатывается :D
Alexander
@drcha0s но есть же стериотипы, что это работает
Yura
дык я не против!
Alexander
могу убить, я решил, что раз у меня получилось что-то типа совета то можно и пошутить
Yura
ненене
Yura
я шутил
Alexander
все шутят fix шутка
Andrey
неидеальный мир
Kirill
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 будет жить. Поприветствуем!
Alexander
а в кратце сделано, я не уверен, что я готов эту либу тащить прямо сейчас
Alexander
ну или хотя бы куда стоит начинать смотреть
Dmitry
я бы предложил начать с app - там какой-то пример
Dmitry
работает только с sqlite, pg не приделывал
Dmitry
делаешь простые рекорды, описывающие таблицы. К ним добавляется TL инфо о pk, fk, uk. Прогоняется через TH. Получаются классы с информацией о схеме БД на уровне типов, и на уровне значений.
Dmitry
Можно сгенерировать БД, как в persistent (без modify). Можно делать DML. Можно сделать другие рекорды - проекции и через них работать. Можно в проекции добавить списки дочерних рекордов и DML их сразу целиком. Ключи будут на лету генерироваться
Dmitry
в общем, с app, мне кажется, можно разобраться. Главное достижение, что оно компилируется вроде приемлемо по времени
Alexander
обидно coerce не находит само путь между нужными типами без подсказок
Dmitrii
Andrei
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
Big Bux Chungus
а можно instance c (Box c) написать? может deriving via как-то в помощь?