Алексей
Мои идеи дальше дробления тайпклассов не идут
Алексей
В смысле уменьшения боли от дробления
Alexander
т.е. если я в либе ввожу Pointed и Apply то я могу их автоматом получить если у меня есть type Applicative = (Pointed, Apply) ?
Alexander
и если я что-то ввожу в своей либе, то если у меня будут Pointed и Apply то я получу Applicative бесплатно?
Алексей
Идея в том, что в base поменяли определение Applicative, и все, кто объявил инстанс Applicative получает бесплатно инстансы Pointed и Apply. В другой стороны их можно объявлять по отдельности и необярательно оба
Алексей
В общем да
A64m
Время для добавления такой фичи упущено, такой пропозал просто заболтают потому что каждый имеет по этому вопросу мнение
кана
Что-то тут не так. Почему имена полей разные, а типы соответствуют? Так надо?
ну мы сначала требуем линзу для поля "a" из String в Int, на выходе получаем r1 потом требуем для r1 линзу для поля "b" из Int в String, на выходе r2
Dmitry
почему в Int преобразуем поле "a", а из Int уже "b"?
Dmitry
В любом случае, я думаю, что должно быть что-то вроде f :: forall r1. (HasField name r r1 ..., HasField name r1 r2 ...) => Record r -> Record r2С указанием @r1 при вызове f
кана
почему в Int преобразуем поле "a", а из Int уже "b"?
ну это функция вида: { a :: String, b :: Int | r } -> { a :: Int, b :: String | r }
Daniil
Никто не пробовал делать авторизация через auth0 на хаскеле? Думаю рест апи сервак на хаскеле запилить, но auth0 нужен
кана
f :: HasField "a" r0 r1 String Int => HasField "b" r1 r2 Int String => Record r0 -> Record r2 f = (field @"b" %~ show) . (field @"a" %~ length)
Alexander
auth0 == OAuth?
Alexander
https://auth0.com/
Alexander
или это?
Alexander
чем auth0 отличается от стандартного OAuth?
Dmitry
f :: HasField "a" r0 r1 String Int => HasField "b" r1 r2 Int String => Record r0 -> Record r2 f = (field @"b" %~ show) . (field @"a" %~ length)
ага... т.е. мы меняем разные поля (и их типы). Типы случайно совпали как при композиции поля - String -> Int, Int -> String
Daniil
или это?
На который ты ссылку прислал, просто у нас много чего через него работает
кана
auth0 == OAuth?
ну вроде oauth это проток
кана
а auth0 - сервис
Alexander
да, но является ли auth0 просто сервисом поддерживающим OAuth
Alexander
или предоставляет какое-то дополнительное API которое нужно и используется
Alexander
потому, что в первом случае нужно просто позвать нужные методы из oauth пакета, который есть с адресом сервиса
Alexander
а во втором - нужно писать самому
Dmitry
@kana_sama Думаю, в f надо добавить forall r1.. А при вызове f @R1.
кана
@kana_sama Думаю, в f надо добавить forall r1.. А при вызове f @R1.
нет-нет, код выше работает прекрасно же
кана
вопрос мой выше был другой - я бы хотел написать семейство, которое само создаст r1 промежуточный
кана
типа forall r0 r2. Delta [("a", A, B), ("b", C, D)] r0 r2 === forall r0 {r1} r2. (F "a" r0 r1 A B, F "b" r1 r2 C D)
кана
но этого нельзя делать в семействе
Dmitry
"этого" - это чего? forall?
кана
да, нельзя скрыть внутри forall r1
Dmitry
от forall здесь вроде мало толку все равно. Потом придется это "доказывать". Надо конкретно вычислять. Не для произвольных r, а для каких-то твоих обобщенных рекордов. Мне кажется так.
Cheese
да, но является ли auth0 просто сервисом поддерживающим OAuth
в общем случае нет, auth0 даёт тебе возможность управлять аккаунтами твоих пользователей
Cheese
да, но является ли auth0 просто сервисом поддерживающим OAuth
а с того конца, где авторизация, там да, OAuth, или OpenID Connect, или SAML
Alexander
ну т.е. для полноценного взаимодействия нужна либа
Alexander
которую надо написать и помочь сообществу
Cheese
Ассоциированный тип в Foo и диспетчеризация по нему?
а как правильно диспетчеризоваться по ассоциированному типу? синглтоны? или создать искусственный класс с искуственными инстансами?
кана
завтипы) Чет подобная тема только что возникала в блахе
Cheese
не пойду же я в бла за ответами по Хаскелю
Alexander
у тебя в примере как-то типы не сходятся
Alexander
или fooViaBar игнорируют параметр?
Alexander
просто foo не имеет аргументов, а ты пишешь where foo = fooViaBar
Alexander
а fooViaBar имеет аргумент
Alexander
@cblp_su ^
Alexander
спросто я хотел набросать вариант, но не могу понять, что нужно
Alexander
просто если там прокси, то проблемы не видно..
Alexander
ну и вообще если пример более понятный то было бы круче
Cheese
class CFoo a where foo :: TFoo a class CFoo a => CFooBar a where foobar :: TFooBar a class CFoo a => CFooBaz a where foobaz :: TFooBaz a fooViaBar :: TFooBar a -> TFoo a fooViaBaz :: TFooBaz a -> TFoo a data X instance CFoo X where foo = fooViaBar foobar instance CFooBar X where foobar = (realImplementation) data Y instance CFoo Y where foo = fooViaBaz foobaz instance CFooBaz Y where foobaz = (realImplementation)
Cheese
теперь вроде должны сойтись
Cheese
а реальный код вот https://github.com/ff-notes/ron/blob/master/ron/lib/RON/Data/Internal.hs
Alexander
а хочется иметь CFoo, такое чтобы реализация foo определялась типом?
Alexander
извиняюсь, что несколько туплю пока
Alexander
т.е. как бы выглядел идеализированный пример
Cheese
хочется, чтобы было больше гарантий и меньше избыточности. в частности, хочется (1) гарантию, что не определены одновременно CFooBar и CFooBaz и (2) чтобы не писать тривиальный CFoo, а чтобы он сам автомагически выводился
Alexander
+
Alexander
методы принципиальны?
Alexander
@cblp_su закрытое множество классов CFooBa* ?
Alexander
для закрытого: data Q = R | Z class CFoo x (a :: Q) | x -> a where foo :: TFoo x тогда ты не можешь определить только CFooBar или CFooBaz
Alexander
1.hs:33:10: error: • Couldn't match type ‘'Z’ with ‘'R’ arising from a functional dependency between: constraint ‘CFoo Y 'R’ arising from the superclasses of an instance declaration instance ‘CFoo Y 'Z’ at 1.hs:31:10-17 • In the instance declaration for ‘CFooBar Y’
Alexander
или: 1.hs:31:10: error: Functional dependencies conflict between instance declarations: instance CFoo Y 'Z -- Defined at 1.hs:31:10 instance CFoo Y 'R -- Defined at 1.hs:32:10 | 31 | instance CFoo Y Z where foo = fooViaBaz (foobaz @ Y)
Alexander
для открытого множества это не сработает
Alexander
но буков все равно столько же сколько у тебя
Alexander
более хороший вариант это писать только CFoo
Alexander
@cblp_su или что-то такое: https://paste.pound-python.org/show/k5lDF5glG3Qbemrjs1Q4/
Alexander
CFoo определяет через какой тип ты работаешь, сможешь только один на тип определить
Alexander
FooVia определяет realImplementation
Alexander
fooVia' юзерский метод, который тупо работает
Alexander
если бы realImplementation можно было бы куда-нить вынести или обобщить или вытащить в CFoo то тогда бы FooVia можно было бы автоматом получить
Alexander
если у тебя есть зависимость, то можно втащить TFooBar в классы
Alexander
инъективность т.е. есть
Alexander
тогда можно TypeApplication в fooVia' выкинуть
Алексей
@cblp_su Я использовал такой подход: class FooImpl (Impl a) а => Foo a where type Impl a foo :: Foo a => TFoo a foo = defined via fooImpl class FooImpl tag a where fooImpl :: Proxy tag -> TFoo a
Алексей
Но мне не были нужны разные TWhateverFoo
Alexander
типы не сходятся?
Alexander
1 строка
Алексей
У меня сходились. Я это для хитровывернутой сериализации