Size: a a a

2020 July 12

AP

Anatolii Prylutskyi in Haskell
для getField нужен HasField а IsLabel
источник

AP

Anatolii Prylutskyi in Haskell
с HasField и AllowAmbiguousTypes получилось интанс написать
источник

AP

Anatolii Prylutskyi in Haskell
чето теперь не хочет работать в окружении
источник

AP

Anatolii Prylutskyi in Haskell
ага
источник

AP

Anatolii Prylutskyi in Haskell
ну это блин из-0за AllowAmbiguos я просто проблему отложил
источник

JS

Jerzy Syrowiecki in Haskell
Anatolii Prylutskyi
Пытаюсь вот такой тайпкласс сделать:
class Action x a where
 send :: (MonadIO m , IsLabel x (r -> TQueue a) , MonadReader r m) => a -> m ()
 send act = do
   chan <- asks (getField @x)
   atomically $ writeTQueue chan act


но что-то не омгу компилятор побороть
ScopedTypeVariables
источник

AP

Anatolii Prylutskyi in Haskell
не помогают:(
источник

AP

Anatolii Prylutskyi in Haskell
Вот на чем сейчас остановился
class Action x a where
 send :: (MonadIO m, HasField x r (TQueue a), MonadReader r m) => a -> m ()
 send act = do
   chan <- asks (getField @x)
   atomically $ writeTQueue chan act
источник

AP

Anatolii Prylutskyi in Haskell
library/IDCar/Action.hs:16:3-76: error:
   • Could not deduce (Action x0 a)
     from the context: (Action x a, MonadIO m, HasField x r (TQueue a),
                        MonadReader r m)
       bound by the type signature for:
                  send :: forall k (x :: k) a (m :: * -> *) r.
                          (Action x a, MonadIO m, HasField x r (TQueue a),
                           MonadReader r m) =>
                          a -> m ()
       at library/IDCar/Action.hs:16:3-76
     The type variable ‘x0’ is ambiguous
   • In the ambiguity check for ‘send’
     To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
     When checking the class method:
       send :: forall k (x :: k) a (m :: * -> *) r.
               (Action x a, MonadIO m, HasField x r (TQueue a),
                MonadReader r m) =>
               a -> m ()
     In the class declaration for ‘Action’
  |
16 |   send :: (MonadIO m, HasField x r (TQueue a), MonadReader r m) => a -> m ()
источник

MK

Maxim Koltsov in Haskell
Слушай, а зачем это вообще класс, а не просто функция?
источник

AP

Anatolii Prylutskyi in Haskell
я не могу понять в каком месте x0 и x разошлись
источник

JS

Jerzy Syrowiecki in Haskell
кстати, да, попробуй функцию сначала
источник

AP

Anatolii Prylutskyi in Haskell
class Action x a

send :: (Action x a, MonadIO m, HasField x r (TQueue a), MonadReader r m) => a -> m ()
send act = do
 chan <- asks (getField @x)
 atomically $ writeTQueue chan act
источник

AP

Anatolii Prylutskyi in Haskell
вот так?
источник

JS

Jerzy Syrowiecki in Haskell
Anatolii Prylutskyi
я не могу понять в каком месте x0 и x разошлись
берутся из разных контекстов/сигнатур
источник

JS

Jerzy Syrowiecki in Haskell
Anatolii Prylutskyi
class Action x a

send :: (Action x a, MonadIO m, HasField x r (TQueue a), MonadReader r m) => a -> m ()
send act = do
 chan <- asks (getField @x)
 atomically $ writeTQueue chan act
здесь нужен явный forall для прокидывания x из одной синтатуры в другую
источник

JS

Jerzy Syrowiecki in Haskell
Anatolii Prylutskyi
class Action x a

send :: (Action x a, MonadIO m, HasField x r (TQueue a), MonadReader r m) => a -> m ()
send act = do
 chan <- asks (getField @x)
 atomically $ writeTQueue chan act
и класс можно убрать
источник

AP

Anatolii Prylutskyi in Haskell
класс убрал
источник

AP

Anatolii Prylutskyi in Haskell
x0 :(
источник

MK

Maxim Koltsov in Haskell
Anatolii Prylutskyi
class Action x a

send :: (Action x a, MonadIO m, HasField x r (TQueue a), MonadReader r m) => a -> m ()
send act = do
 chan <- asks (getField @x)
 atomically $ writeTQueue chan act
Вот здесь forall добавь, как Юра предложил
источник