Skip to content

Cannot apply a method of a class to an associated data type of that class in a polymorphic context.

Summary

If D α is an associated data type of a class C α, then methods of type D α → X should be parametrically polymorphic.

Steps to reproduce

class FantasticClass α where
  data FantasticData α
  showFantasticData ∷ FantasticData α → Text

instance FantasticClass Text where
  data FantasticData Text = FantasticText Text
  showFantasticData (FantasticText text) = text

data Problematic α = Problematic
  { parametricallyPolymorphicField ∷ [α]
  , problematicallyPolymorphicField ∷ FantasticData α
  }

type Repaired = Coyoneda Problematic

repair ∷ [α] → FantasticData α → Repaired α
repair list fantasticData = liftCoyoneda Problematic
  { parametricallyPolymorphicField = list
  , problematicallyPolymorphicField = fantasticData
  }

extractWithExtractor ∷ (∀ α. prefunctor α → ξ) → Coyoneda prefunctor α → ξ
extractWithExtractor projection = getConst ∘ lowerCoyoneda ∘ hoistCoyoneda (Const ∘ projection)

extractProblematicallyPolymorphicField ∷ Repaired α → Text
extractProblematicallyPolymorphicField = extractWithExtractor
  \ Problematic {..} → showFantasticData problematicallyPolymorphicField

Expected behavior

I expected this example to compile. Specifically, I expected showFantasticData to apply to problematicallyPolymorphicField.

The method:

showFantasticData ∷ FantasticClass α ⇒ FantasticData α → Text

— Is a constrained polymorphic function, but it should be parametrically polymorphic. See: for the constraint not to resolve, there must be given a value problematicallyPolymorphicField ∷ FantasticData X such that FantasticClass X is not in scope. But this can never happen because FantasticData X is an associated data type of the instance FantasticClass X. The instances and the associated data types are in one to one correspondence, so there cannot be ambiguity either. In other words, the value of type FantasticData X is a witness that the constraint FantasticClass X is uniquely satisfiable.

Environment

  • GHC version used: The Glorious Glasgow Haskell Compilation System, version 9.2.2
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information