кана
расширение TypeFamilies для этого нужно
кана
это и есть те семейства
Anonymous
🤔 а как это относится к семействам
кана
class Foo a where data X a :: * ...
ну тут X - тайп-левел функция (семейство типов), отдающая тип для некого a
Denis
@qnikst у тебя стек прекратил про shadowed dependencies говорить?
Alexander
не знаю, я не тестил
Denis
у меня сегодня минимум 10 раз случилось
Alexander
у тебя stack из гита?
Denis
я начинаю потихоньку принимать сторону тони морриса
Denis
а там из гита надо?
Alexander
да
Alexander
они так и не релизнули пофикшенное
Alexander
там какой-то флаг обновления стека есть
Alexander
чтобы из гита брал
Anonymous
аааа
Denis
о, спасибо
Denis
я уж пуллить полез
Kirill
ну тут X - тайп-левел функция (семейство типов), отдающая тип для некого a
окей, с этим вроде понял, а если кайнд для этого типа * как тогда? ghc плачет что я не использую в семействе ни одну из переменных тайпкласса
кана
type X String = X в инстансе
Kirill
он мне на класс ругается: class MyClass a where type MyAssociatedType :: *
Kirill
P.S. Я догадываюсь что я занимаюсь ерундой и мне надо просто двинуть мой дататайп к классам, но тем не менее интересно можно ли такую проблему в принципе решить
Alexander
если ты скажешь как ругается то есть шанс что кто-то сможет подсказать
Anonymous
а когда там будут нормальные сообщения с ошибками в ghc?
Alexander
т.к. таким образом оно решается
Alexander
в 8.2 что не устраивает?
Alexander
разве что —explain нету
Anonymous
а уже добавили?
Kirill
The associated type ‘MyAssociatedType’ mentions none of the type or kind variables of the class MyClass m’
кана
class C a where type X a :: * f :: X a -> a data X' = X' String instance C String where type X String = X' f (X' s) = s
Anonymous
те как в расте
Alexander
@saksmt ты очень невнимательно переписал, то что я написал
Alexander
type X a
Alexander
сообщение об ошибке это терминусом по консоли написало
A64m
те как в расте
а в расте какие?
Alexander
как в 8.2 выделяется и ещё номер ошибки
Alexander
по номеру можно сделать rustc —explain
Anonymous
ну там подчеркивает места где ошибка, а не просто выдает line:column
A64m
т.е. как в кланге?
Alexander
и оно man page покаэет
Alexander
@anarchostatist это уже в 8.2 есть
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
я не знаю в какую конфу задать вопрос, но думаю, что тут есть люди, которые смогут ответить есть способ брать код на хаскеле и каким-то образом доказывать его на идрисе не переписывая/не переписывая ручками?
Alexander
нет
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
спасибо!
Anonymous
у идриса же похожий синтаксис
Alexander
ну разве что запостить на stack-overflow
Alexander
и подождать пока перепишут
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
норм способ
Alexander
синтаксис то похожий, но хоть что-то интересное доказать и уже все переписывать надо
Alexander
/me ушёл смотреть анимешки
кана
как я понимаю, coq сейчас самый активноюзаемый прувер в продакшене. И у него есть фича генерить код на хаскеле. Насколько это используют вообще?
Denis
тут все веобу чтоли
Alexander
на питерском prog были люди которые говорят что используют это
Denis
прувер в продакшене лол
Denis
смешно
Alexander
но хз можно ли им доверять
кана
ну вон в касперском хотели что-то прувать, не херней же они там маются
Anonymous
тут все веобу чтоли
как что-то плохое
Denis
я тоже кой-чего прувил, но фраза от этого не менее смешная
Kirill
type X a
а для type X такое сделать нельзя? data у меня не параметризована в коде (просто не удачный пример привёл), равно как и то где она используется: data X class C m where a :: X -> m () —- data X = X String instance C SomeMonad where a x = {- implementation using x -}
кана
вот же я код скинул
кана
class C a where type X a :: * f :: X a -> a data X' = X' String instance C String where type X String = X' f (X' s) = s
Kirill
Тут же оно от a зависит, который надо добавлять в параметры класса
кана
X внутри класса - это не просто тип, это функция, которая вернет тип для типа, для которого делают инстанс, поэтому у нее должен быть аргумент
Kirill
аааа
Kirill
тут a не имеет ничего общего с a в классе?
кана
имеет, это и есть тот a
кана
но у тебя a и так есть в классе
кана
Можно в хаскеле объявить абстрактный тип и его реализацию в другом модуле? что-то типа такого: module A where data X class MyClass a where a :: X -> a —- module B where import A data X = X String instance MyClass String where a (X v) = v
кана
ты же для этого a потом инстанс делаешь
кана
мой код выше - это полностью завершенный код, который тебе нужен, только имена переменуй. Никаких лишних переменных я не добавлял
кана
вот так понятнее, думаю {-# LANGUAGE TypeFamilies, TypeSynonymInstances, FlexibleInstances #-} class C a where type GetTypeFor a :: * f :: GetTypeFor a -> a data X = X String instance C String where type GetTypeFor String = X f (X s) = s
Kirill
да я уже понял как для * -> * сделать то, что я хочу. пример не удачный (мой изначальный) у меня кайнд * и нет аргументов которые влияют на этот датакласс
кана
чувак
кана
посмотри на код
Denis
я тут мимо крокодил, но вы что-то странное делаете
кана
X имеет каинд *
Denis
смысл упражнения “объявить абстрактный тип и его реализацию в другом модуле” в чем?
Denis
в другом пакете я бы понял