кана
расширение TypeFamilies для этого нужно
кана
это и есть те семейства
Anonymous
🤔 а как это относится к семействам
Denis
@qnikst у тебя стек прекратил про shadowed dependencies говорить?
Alexander
не знаю, я не тестил
Denis
у меня сегодня минимум 10 раз случилось
Alexander
у тебя stack из гита?
Denis
я начинаю потихоньку принимать сторону тони морриса
Denis
а там из гита надо?
Alexander
да
Alexander
они так и не релизнули пофикшенное
Alexander
там какой-то флаг обновления стека есть
Alexander
чтобы из гита брал
Anonymous
аааа
Denis
о, спасибо
Denis
я уж пуллить полез
кана
type X String = X в инстансе
Kirill
он мне на класс ругается:
class MyClass a where
type MyAssociatedType :: *
Kirill
P.S. Я догадываюсь что я занимаюсь ерундой и мне надо просто двинуть мой дататайп к классам, но тем не менее интересно можно ли такую проблему в принципе решить
Alexander
если ты скажешь как ругается то есть шанс что кто-то сможет подсказать
Anonymous
а когда там будут нормальные сообщения с ошибками в ghc?
Alexander
т.к. таким образом оно решается
Alexander
в 8.2 что не устраивает?
A64m
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
сообщение об ошибке это терминусом по консоли написало
Alexander
как в 8.2 выделяется и ещё номер ошибки
Alexander
по номеру можно сделать rustc —explain
Anonymous
ну там подчеркивает места где ошибка, а не просто выдает line:column
A64m
т.е. как в кланге?
Alexander
и оно man page покаэет
Anonymous
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
в другом пакете я бы понял