Ошибка «Не удалось вывести экземпляр»; два контекста? - PullRequest
0 голосов
/ 01 мая 2020

Я читал https://www.reddit.com/r/haskell/comments/gb7f9l/design_trade_offs_for_different_application/fp5kmjv и что-то пробовал. Я столкнулся с ошибкой, которую не понимаю.

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableSuperClasses #-}

import Control.Monad
import Control.Monad.Reader.Class
import Data.Kind

newtype Y = Y { unY :: Int }

data Services c = Services
  { service1 :: forall m. c m => m Int
  , object :: forall m. c m => m Y  
  }

myServices :: c ~ (MonadReader (Services c)) => Services c
myServices = Services
  { service1 = unY <$> join (asks object)
  , object = pure $ Y 2
  }

Все ошибки go Например.

    * Could not deduce (Functor m) arising from a use of `<$>'
      from the context: c ~ MonadReader (Services c)
        bound by the type signature for:
                   myServices :: forall (c :: (* -> *) -> Constraint).
                                 (c ~ MonadReader (Services c)) =>
                                 Services c
      or from: c m
        bound by a type expected by the context:
                   forall (m :: * -> *). c m => m Int

Однако мне кажется, что

(c m, c ~ (MonadReader (Services c))

должно означать

MonadReader (Services c) m

и как

Monad m => MonadReader r m where ...

затем

Monad m -- implies Applicative m implies Functor m

Что я неправильно понял? Является ли тот факт, что два контекста представлены отдельно, как-то актуально - почему он не имеет доступа к обоим контекстам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...