Kirill
X имеет каинд *
X да, а GetTypeFor - нет, у меня аргумента который передать в GetTypeFor
кана
instance C String where type GetTypeFor String = X
кана
String
кана
у тебя a = String
кана
и ты меняешь a на String
Kirill
вот
Kirill
или тут капитальное недопонимание
кана
а, вот, если у тебя класс без параметров (хз, как это), тогда да
кана
но ранее ты говорил про дату
Kirill
смысл упражнения “объявить абстрактный тип и его реализацию в другом модуле” в чем?
спортивный интерес и желание хранить отдельно интерфейс и реализацию (с возможностью потом двинуть это дело хоть в другой пакет)
кана
но мой код выше полностью подходит под твой начальный пример без добавления никаких лишних переменных
кана
но подожди, как может быть класс без аргументов?
Kirill
но мой код выше полностью подходит под твой начальный пример без добавления никаких лишних переменных
да я понял (ещё сообщений 10 назад) :) и пытался объяснить тебе что мне не совсем это нужно
кана
то есть какие инстансы у этого класса могут быть?
Kirill
но подожди, как может быть класс без аргументов?
класс с аргументами, но внутри data они никак не используются
Kirill
я ж запилил новый пример
кана
бля
кана
хахахаха
кана
я не могу
кана
они и у меня не используются
Kirill
...
A64m
но подожди, как может быть класс без аргументов?
вообще может, но это наверное самая бесполезная гхц-фича
Kirill
фак
Kirill
)
Kirill
они и у меня не используются
ну правда остаётся проблема что внутри класса кайнд * -> *
кана
тогда да, могу предположить, что ты хочешь что-то странное
Kirill
да я понимаю что хочу что-то странное)
A64m
синглтоны на классах?
синглетоны там не при чем https://ghc.haskell.org/trac/ghc/ticket/7642
A64m
isPrime :: RiemannHypothesis => Integer -> Bool
кана
class C a where type GetType a :: * f :: GetType a -> a () data X = X String instance C IO where type GetType IO = X f (X s) = print s
кана
так, то же самое же
кана
вот твой второй пример
кана
@saksmt
Denis
синглетоны там не при чем https://ghc.haskell.org/trac/ghc/ticket/7642
я про одноименную библиотеку не говорю, если что
Denis
тикет видел, смысла не особо понял
A64m
да его и нет
Kirill
вот твой второй пример
сам аргумент в инстансе выглядит как-то так: (AlmostStateMonad s) и теперь ghc говорит что хочет тип, а ему констрейнт даю
A64m
т.е. предполагается что он такой, кто-то пишет частичные функции с констрейнтом Partial а автор приложения у себя пишет instance Partial - все, согласился частичные функции использовать, а пока не сделает этого - не работают они
Kirill
т.е. в: class C (m :: * -> *) where type TypeFor x :: x a :: (TypeFor m) -> Int
Kirill
Expecting one more argument to ‘m’ Expected a type, but ‘m’ has kind ‘* -> *’
кана
звездочка справа от ::
Kirill
кажись понял
Kirill
я думал это для результирующего типа
Kirill
надо было в меня маном на это дело кинуть видимо
кана
https://wiki.haskell.org/GHC/Type_families
кана
я думал это для результирующего типа
ну так результатирующий тип как раз * и есть. Для IO (* -> *) это X (*)
кана
аааа
Kirill
так, как сделать функцию из * -> * в *?
кана
я понял, что ты имел в виду type GetType (a :: * -> *) :: *
Kirill
о, спасибо)
кана
так, как сделать функцию из * -> * в *?
так это она и есть, что выше (во всех примерах)
кана
type GetType a :: * и type GetType (a :: * -> *) :: * одно и то же, так как каинд a выводится из этого типа f :: GetType a -> a ()
Kirill
ахахахаха, я вернулся к исходной проблеме: The associated type ‘ActorPathFor’ mentions none of the type or kind variables of the class ‘ActorActionMonad m’ —- class Monad m => ActorActionMonad (m :: * -> *) where data ActorPathFor (x :: * -> *) :: *
Kirill
вот короче
Kirill
это реальный код
Kirill
не спрашивайте зачем я хочу акторы
кана
import Control.Monad class C a where type GetType a :: * f :: GetType a -> a () data X = X String instance Monad m => C m where type GetType m = X f (X s) = void $ pure s
кана
вот заранее решение)
кана
да у и меня и такой код работал class Monad a => C a where type GetType a :: * f :: GetType a -> a () data X = X String instance C IO where type GetType IO = X f (X s) = print s
кана
ActorPathFor это такая функция, которая вернет нужный тип для того типа, под который ты делаешь интанс. Это как бы один кейс функции сделаешь два инстанса для IO и для Maybe и получишь функцию ActorPathFor :: (* -> *) -> * ActorPathFor Maybe = X ActorPathFor IO = Y
Kirill
• Expecting one more argument to ‘m’ Expected a type, but ‘m’ has kind ‘* -> *’ —- class Monad m => ActorActionMonad (m) where data ActorPathFor x :: * tell :: Typeable msg => (ActorPathFor m) -> msg -> m ()
Kirill
вот это что-то не работает и я догадываюсь почему
Kirill
но не понимаю как починить
Kirill
и возможно ли это
кана
я же написал, почему
кана
потому что у тебя x с m никак не связывается, это же одна переменная
кана
обычно для функций сразу пишется ее тип, а потом кучу кейсов. Тут мы пишем тип функции в классе, а кейсы в инстансах
кана
class Monad m => ActorActionMonad (m :: * -> *) where type ActorPathFor (m :: * -> *) :: * f :: ActorPathFor m -> m () data X = X String instance ActorActionMonad IO where type ActorPathFor IO = X f (X s) = print s
Kirill
всё, работает, по крайней мере на класс больше не ругается, зато ругается на инстанс: instance ActorActionMonad (Actor s) where data ActorPathFor (Actor s) = ActorPath —- class Monad m => ActorActionMonad (m) where data ActorPathFor m :: * —- Couldn't match type ‘ActorPath’ with ‘ActorPathFor (Actor s)’ Expected type: Actor s (ActorPathFor (Actor s))
кана
так а что там ниже, после expected
Kirill
Tell
Kirill
Ладно, завтра ещё над этим посижу
Alexander
там что там интересное было?
Alexander
@saksmt а где ActorPath объявлено?
Alexander
и если ошибки копируешь, пожалуйста копируй с контекстом
Alexander
{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE TypeFamilies #-} newtype Actor s a = Actor (IO a) deriving (Functor,Applicative,Monad) class Monad m => ActorActionMonad (m) where data ActorPathFor m :: * instance ActorActionMonad (Actor s) where data ActorPathFor (Actor s) = ActorPath