Skip to content

Instantly share code, notes, and snippets.

@sevanspowell
Created September 12, 2019 03:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sevanspowell/f44c2fdba4c6286ee07dd8a0c6b73cea to your computer and use it in GitHub Desktop.
Save sevanspowell/f44c2fdba4c6286ee07dd8a0c6b73cea to your computer and use it in GitHub Desktop.
Haskell TypeFamilies confusion
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
type Logger m = Severity -> String -> m ()
-- Fundep
class HasLoggerFundep r m | r -> m where
loggerLFundep :: Lens' r (Logger m)
x :: (MonadReader r m, HasLoggerFundep r m) => m ()
x = do
log <- asks (^. loggerLFundep)
log DebugS "x"
-- Type Families
class HasLogger r where
type LoggerF r :: Type -> Type
loggerL :: Lens' r (Logger (LoggerF r))
y :: (MonadReader r m, HasLogger r) => m ()
y = do
log <- asks (^. loggerL)
log DebugS "x"
@sevanspowell
Copy link
Author

sevanspowell commented Sep 12, 2019

error:
    • Couldn't match type ‘m’ with ‘LoggerF r’
      ‘m’ is a rigid type variable bound by
        the type signature for:
          y :: forall r (m :: * -> *). (MonadReader r m, HasLogger r) => m ()
      Expected type: Control.Lens.Getter.Getting
                       (Severity -> String -> m ()) r (Severity -> String -> m ())
        Actual type: (Logger (LoggerF r)
                      -> Data.Functor.Const.Const
                           (Severity -> String -> m ()) (Logger (LoggerF r)))
                     -> r -> Data.Functor.Const.Const (Severity -> String -> m ()) r
    • In the second argument of ‘(^.)’, namely ‘loggerL’
      In the first argument of ‘asks’, namely ‘(^. loggerL)’
      In a stmt of a 'do' block: log <- asks (^. loggerL)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment