NC
https://hackage.haskell.org/package/brick
Спасибо, уже вожусь с ней
Anonymous
А кто-нибудь в курсе ситуации с полиморфизмом структур, вроде пару лет назад собирались реализовать возможность писать тип 'любая структура в которой есть такие-то поля', но я не нашел ничего подобного в релиз ноутс.
кана
http://hackage.haskell.org/package/base-4.11.1.0/docs/GHC-Records.html
кана
пока только это
кана
{-# LANGUAGE DuplicateRecordFields, DataKinds, FlexibleContexts, TypeApplications #-} import GHC.Records data A = A { a :: Int } deriving Show data B = B { a :: Int, b :: String } deriving Show f :: (Show r, HasField "a" r Int) => r -> String f r = mconcat [ "Record " , show r , " has field 'a' with value " , show (getField @"a" r) ] main = do putStrLn $ f (A 10) putStrLn $ f (B 20 "hello") -- Record A {a = 10} has field 'a' with value 10 -- Record B {a = 20, b = "hello"} has field 'a' with value 20
Anonymous
Понял, спасибо. Кстати собачек ещё не было когда в последний раз смотрел, а тут ещё и со строками. Видимо только синтаксического сахара не хватает.
кана
это TypeApplications (и DataKinds для "строк")
Cheese
до собачек пользовались Proxy для достижения такого же эффекта
Cheese
и DataKinds не ново
Cheese
из нового только HasField
Anonymous
Удобно. Пригодится. Пасиб!
Anonymous
Не найти 😞: https://www.haskell.org/hoogle/?hoogle=IsLabel
Anonymous
https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/OverloadedLabels
Anonymous
A new module GHC.OverloadedLabels defines the IsLabel class
Anonymous
Определение класса IsLabel есть на hackage?
кана
http://hackage.haskell.org/package/base-4.11.1.0/docs/GHC-OverloadedLabels.html
A64m
А какому классу?
{-# LANGUAGE AllowAmbiguousTypes , FlexibleInstances , MultiParamTypeClasses , ScopedTypeVariables , TypeApplications , DuplicateRecordFields , OverloadedLabels , FlexibleContexts #-} module Records where import GHC.OverloadedLabels import GHC.Records instance HasField x r a => IsLabel x (r -> a) where fromLabel = getField @x fb r = if #bar r then #foo r else 0 f1 = fb $ FooBar 42 True -- 42 f2 = fb $ BarFoo True 24 -- 24 data FooBar = FooBar { foo :: Int, bar :: Bool } data BarFoo = BarFoo { bar :: Bool, foo :: Int }
кана
смотрите какую бесполезную множество раз запиленную неэффективную штуку запилил https://gist.github.com/kana-sama/e883549d4e7c44cf854f233115a4ac93 кастомные рекорды на символах + структурный полиморфизм (?) + функция построения рекорда (самое геморное)
Vladislav
На типы надейся, а тест не плошай.
Maxim
Народ, есть такая задача - сказать стеку, что при обновлении одного файла в репе надо пересобрать кастомный Setup.hs и обязательно перезапустить его configure Пробовал extra-source-files в кабале и TH-ный addDependentFile Это приводит к тому, что Setup.hs когда надо пересобирается, но вот configure заново не делается, сразу идёт build
Alexander
alias stack=cabal (извините)
Alexander
а на самом деле посмотреть документацию по setup-depends и можно ли там зависимость от файла сделать
Maxim
alias stack=cabal (извините)
можно подумать это проблема чисто стека
Alexander
пока ты не проверил поведение кабал-инсталл этого нельзя исключать
Maxim
ну я в любом случае не могу уйти со стака :)
Alexander
https://www.haskell.org/cabal/users-guide/developing-packages.html?highlight=setup%20depends#pkg-field-custom-setup-setup-depends
Maxim
ну так там только пакеты можно указать
кана
могу я как-то кидать ошибку компиляции тут? Когда нет инстанса для закрытого ТФ
кана
вообще думается мне, что делать рекорды на отдельных тайп-мапах - тупиковый путь, не получится без грязных трюков связать структуру рекорда с структурой на типах, нужно фьюзить реализацию рекорда с реализацией мапы, как выше проблемы появлятеся на на сеттерах, которые меняют тип полей кто-нибудь разбирался с устройством винила, может пояснить как там?
кана
@A64m_qb0 не видел ли ты где готовой функции, конвертирующей линзы вида s -> (a, b -> t) в (a -> f b) -> (s -> f t)?
A64m
не помню такого
Апач
Почему у линз такое контр-интуитивное название?
A64m
в смысле?
кана
почему контриннутивное?
кана
многие умудряются связывать законы физических линз на законы хаскельных линз
NC
Линза это инструмент, который позволяет фокусироваться на части структуры и работать только с ней
Anonymous
я не шарю в линзах, но помню читал какой-то туториал и там было про зум https://hackage.haskell.org/package/lens-4.6.0.1/docs/Control-Lens-Zoom.html вот я тогда подумал "ааа ну теперь понятно почему линзы"
Maxim
ох зум
Maxim
меня немного выбесило когда с этим разбирался, что есть zoom, а есть magnify, блин
Maxim
делают по сути одно и то же
кана
type SimpleLens s t a b = s -> (a, b -> t) lensFromSimple :: SimpleLens s t a b -> Lens s t a b lensFromSimple l f s = let (a, g) = l s in fmap g (f a) ну собственно функция-то просто пишется, просто вроде оба подхода довольно популярны, наверняка где-то есть что-то подобное
NC
Оно вообще на проектор из функана похоже.
Проекторы как метафора не поддерживают композицию
Сергей
линзы должны быть на профункторах, у меня все
Линзы, которые (a -> f b) -> (s -> f t) - это частный случай линз на профункторах ? Сложилось такое впечатление. Если верно, то какие дополнительные возможности появляются ?
Сергей
геттеры и сеттеры с модификаторами выражаются и на простом функторе, а что можно сделать с дополнительным контравариантным параметром?
кана
не помню такого
окей, а есть инструмент для вановских линз, чтобы и читать, и писать (за один раз). То есть прочитать и получит сеттер
кана
а, ну это сама линза же
Апач
Проекторы как метафора не поддерживают композицию
соответствующих размерностей поддерживают же
Апач
p : A->B q : B->C скомпозиционируются
Cheese
делают по сути одно и то же
так ведь ask и get тоже делают одно то же, а называются по-разному
Maxim
хм...
Maxim
ну вообще да
Maxim
тем не менее, я считаю что немного confusing
кана
https://gist.github.com/kana-sama/6ac112aff933a34ea12c4878a80755fd переписал вчерашние рекорды, теперь: a) вся работа с ними изначально через линзы b) они не статичны, то есть можно менять линзами типы полей c) красивые лейблы для линз все бы круто, но они не работают) Там оверлапинг инстанов для генерации линз, которого быть не должно вообще. Тыкал на шару OVERLAPS/PABLE/PING, не помогло, мануал тоже почитал, не помогло (то есть они говорят как правильно расставить приоритет, но там оверлапинг в принципе не должен был появиться). Может кто помочь? Для кода нужны только lens, ошибка возникает в самом конце (в месте использования), инстансы так же выделил комментариями
Alexander
мне лень глядеть после baal но тогда лейблов не было
Alexander
и сейчас можно проще
Alexander
а блин нету на гитхабе :/
кана
ну проблема выше к лейблам не привязана, она и без них, проблема чисто в рекурсивных инстансах, мб попробую сделать абстрактный пример
Alexander
я бы просто показал что у меня есть может быть помогло
Alexander
у меня были record над вектором Any и линзы которые могут менять типы
Alexander
но к сожалению я не запушил это на гитхаб и оно на другом ноуте
Alexander
просто у тебя может совсем по другому сделано, раньше часть путей закрыто было
Alexander
я может завтра-послезавтра осилю смотреть если силы и польза будет :/
A64m
HasField name ((name ::: a) ': r) ((name ::: b) ': r) a b HasField name ((name' ::: c) ': s) ((name' ::: c) ': t) a b очевидно оверлапятся
кана
ну вот ошибка
кана
второй инстанс же не подходит
кана
там не будет требуемого HasField name s t a b
A64m
при оверлапе только голова считается
кана
это поведение можно обойти?
A64m
нет