Kirill
X имеет каинд *
X да, а GetTypeFor - нет, у меня аргумента который передать в GetTypeFor
кана
instance C String where
type GetTypeFor String = X
кана
String
кана
у тебя a = String
кана
и ты меняешь a на String
Kirill
Kirill
вот
Kirill
или тут капитальное недопонимание
кана
а, вот, если у тебя класс без параметров (хз, как это), тогда да
кана
но ранее ты говорил про дату
кана
но мой код выше полностью подходит под твой начальный пример без добавления никаких лишних переменных
Denis
кана
но подожди, как может быть класс без аргументов?
Kirill
кана
то есть какие инстансы у этого класса могут быть?
Kirill
я ж запилил новый пример
кана
бля
кана
хахахаха
кана
я не могу
кана
они и у меня не используются
Kirill
...
Kirill
фак
Kirill
)
Denis
кана
тогда да, могу предположить, что ты хочешь что-то странное
Kirill
да я понимаю что хочу что-то странное)
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
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
кана
аааа
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