Я читал 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
Что я неправильно понял? Является ли тот факт, что два контекста представлены отдельно, как-то актуально - почему он не имеет доступа к обоим контекстам?