кана
class (Monad m) => ConfigMonad m where getConfig :: m Config instance (Monad m) => ConfigMonad (ReaderT Config m) where getConfig = ask instance (ConfigMonad m) => ConfigMonad (ReaderT r m) where getConfig = lift getConfig При попытке вызова выдает Overlapping instances for ConfigMonad (ReaderT Config (ServerPartT IO))(инстансов всего 2), вроде бы с точки зрения математики тут никакого пересечения нет. Я что то не так делаю или это ограничение компилятора?
есть пересечение, ведь ConfigMonad тоже Monad лучше так наверное: class Monad m => MonadConfig m where getConfig :: m Config instance MonadReader Config m => MonadConfig m where getConfig = ask data SomeComplexConfig = SomeComplexConfig { config :: Config , meta :: Meta } instance MonadReader SomeComplexConfig m => MonadConfig m where getConfig = asks config
Alexander
ну оно же ругается не на теоретически возможное пересечение
Alexander
а на конкретное инстанцирование, в котором нет пересечения
кана
есть, я же говорю
Alexander
видимо меня нужно ткнуть носом как
кана
второй инстанс перекрывает первый, так как ConfigMonad тоже Monad
Alexander
клево
Alexander
в конкретном случае нельзя применить второй инстанс же
кана
мало того, второй инстанс очень страннй
кана
ты типа цепочку ReaderT делаешь
кана
по моему в mlt вложенные ридеры вообще невозможны
Alexander
а с чего бы им быть невозможными?
Alexander
собственно, кейс простой, я хочу сделать композицию из ридера с конфигами и ридера который на основе конфигов и ServerPartT IO аутентифицировать юзеров и класть в ридер
кана
поому что MonadReader и фандепы, полагаю
кана
кана
(без newtype то же самое, не может сделать ask String, когда MonadReader Int)
Alexander
сдается мне дело в GeneralizedNewtypeDeriving
кана
кана
я же написал, что без newtype то же самое
Alexander
а ок
Alexander
а какой самый правильный способ завернуть readerT в свой трансформер?
кана
видел красивое решение mtl с фантомными метками-тегами, тогда можно вложенные ридеры (наверное типа ask @"number")
Alexander
и всё-таки, почему конкретно мой код фейлит?
Alexander
чисто из академического интереса
Alexander
он же не может использовать второй инстанс так как констрейнт на втором инстансе не проходит
тот
можете куда то направить в поисках материала чтобы научиться и заодно что то полезное написать на haskell. через поисковики быстро закончились материалы, вдруг что укажете новое
Anonymous
@patinity https://www.cardano.org/en/what-is-cardano/
тот
@patinity https://www.cardano.org/en/what-is-cardano/
видел выступление Дениса Шевченко на эту тему, благодарю за ссылку, имеете в виду втянуться в это направление, как интересное и полезное? рассуждал с чего простого начать типа парсера что то такое чтобы обучиться хоть чему, криптография конечно любопытно, исходил до этого нужно еще что то уметь, благодарю за наведение на полезную мысль
Anonymous
втянуться имеет смысл во что-то, что будет использоваться ежедневно и/или приносить деньги. а писать парсер как бесцелевое упражнение - как напишете, так и забудете
Alexander
Не согласен
Alexander
Раскрывать мысль не буду, но @patinity посоветовал бы пилить то, что наиболее интересно самому.
Anatolii
Ну и наверное если есть возмодность написать какой-то маленькие сервис для какой-то реально задачи - лучше сразу с этого начать и задавать тут вопросы по ходу возникновения проблем
Нурлан
Кто-нибудь пытался самостоятельно реализовать на хаскеле логику кольца вычитов?
Нурлан
Не могу придумать как их следать классом Number
Нурлан
просто хотел сделать поле Z_p и чет ума не приложу как реализовать
Нурлан
хотя казалось бы такой простой пример
Ilya
ну поле Z_p и правда простой
Нурлан
p должен быть "произвольным"
Нурлан
Я просто не хочу таскать за собой постоянно знание о числе p.
Ilya
data Z = Z (Int, Int) и вперед
Нурлан
Так то можно было бы сделать объявив data Zp = Z (Integer, Integer)
Нурлан
лишнее нагромождение
Нурлан
не кажется?
Ilya
не кажется?
а как иначе
Ilya
главное не экспортируй конструктор Z
Нурлан
Во всех функциях придется проверять, что числа пришли из одного поля
Ilya
чтобы нельзя было создать "неправильное" значение
Ilya
Во всех функциях придется проверять, что числа пришли из одного поля
аааа, это тебе тогда зависимый тип наверное нужен:)
Ilya
как в идрисе
Нурлан
аааа, это тебе тогда зависимый тип наверное нужен:)
это я пока не понимаю, буду читать. А вообще дошло только что, что можно сделать как в математике, ввести класс фактор-пространства
Ilya
(тут была фигня)
Ilya
такие штуки наверное можно TH генерировать
Ilya
правда p будет не произвольное уже
Ilya
хотя не, фигня какая-то получилась
Ilya
не делай так:)
Нурлан
не, я хочу тестировать на больших p
Denis
Так то можно было бы сделать объявив data Zp = Z (Integer, Integer)
для всех аналогичных случаев надо делать либо data Zp = Z Integer Integer, либо newtype Zp = Z (Integer, Integer)
Denis
иначе вы в два раза больше боксите на каждый чихпых
Denis
Создаете лишние конструкторы и манипулируете указателями в рантайме
Denis
конструктор ненужный для каждой пары используете, словом
Denis
Если нужен алиас для кортежа - есть ньютайпы для этого. А если уж создаете отдельный тип, то пользуйтесь им вместо пары, а не пакуйте туда пару.
Нурлан
я думал, я буду больше ресурсов расходовать если постоянно буду за собой p таскать
Denis
по какой причине?
Нурлан
допустим кто-то отправить мне (Z p a) + (Z q b)
Denis
я в общем про конструирование подобных типов, а не про конкретную задачку, если что
Denis
p это что там?
Нурлан
Число 'p' определяет тип
Denis
p - натуральное?
Нурлан
типов бесконечно много
Нурлан
p - простое
Denis
Фантомные типы и тайл-левел натуральные числа тогда как вариант, если уж совсем не хочется держать в рантайме число.
Denis
впрочем, если оно в рантайме берется, то отдельным аргументом его и делу конец
Denis
так, прочитал чего выше написано, если оно в типе нужно(а оно вроде нужно), тут варианта ровно два: 1) если оно известно статически, то можно фантомные типы и всяких тайп-левел 2) если в рантайме, то нужно завтипы изображать, а это в хаскелле, кхм, удовольствие ниже среднего
Denis
если же убираем условие что p в типе, то все упрощается в разы