haskell - ¿Es posible introducir variables de tipo adicionales en una superclase-restricción?
typeclass type-constraints (1)
Cuando se trata de familias de tipos, a menudo es útil usar restricciones de igualdad para evitar tener que repetir el nombre de alguna función de tipo en una firma:
class Foo f where
type BulkyAssociatedType f :: *
foo :: BulkyAssociatedType f -> f
...
bar :: forall m f b .
( Monad m, Foo f, b ~ BulkyAssociatedType f
, Monoid b, Monoid (m b)
) => f -> m f
Esto funciona incluso si la abreviatura no aparece en la propia firma, solo en las restricciones.
Con las clases, esto aparentemente no es posible;
class ( Foo f, b ~ BulkyAssociatedType f, Monoid b, ...) => Bar f
se queja de que la variable de tipo b
no está en el alcance.
¿Hay alguna manera de lograr algo similar, evitar un poco de repetición?
Me sorprendió saber que no puedes hacer eso (he usado la misma técnica y sé que funciona en declaraciones de instancia ), pero parece que hay una solicitud de características de GHC de larga data para apoyar esto.
Quizás puedas usar ConstraintKinds
para obtener el mismo beneficio:
{-# LANGUAGE TypeFamilies , FlexibleContexts , ConstraintKinds #-}
import Data.Monoid
class Foo f where
type BulkyAssociatedType f :: *
type B f = (Monoid (BulkyAssociatedType f))
class ( Foo f, B f) => Bar f