2012-06-19 19 views
25

¿Cómo puedo tener múltiples restricciones de clase, por lo que si A es un Eq y B es una Num, que podría decir, ya seatipos de Haskell de la firma con varias restricciones de clase

f :: Eq a => a -> b` 

o

f :: Num b => a -> b 

Así ¿Cómo puedo tener Eq a => y Num b => al mismo tiempo?

  • f :: Eq a => Num b => a -> b,
  • f :: Eq a -> Num b => a -> b y
  • f :: Eq a, Num b => a -> b

no hacía lo que quería.

Respuesta

42

Por lo general se denominan restricciones de clase , como Eq y Num son llamados tipo-clases.

¿Qué tal esto?

f :: (Eq a, Num b) => a -> b 

Los paréntesis son importantes.

+1

Aha! Gracias. ¿Estos paréntesis con una coma causan una tupla de alto nivel de algún tipo, o es este otro significado de paréntesis? –

+7

@ Andrew realmente lo hacen (ahora) aunque probablemente no deberías preocuparte por esas cosas todavía. Los tipos de Normall Haskell tienen * kind * (tipo de tipo) '*', por lo que el tipo de tupla tiene kind '* -> * -> *'. En versiones recientes de GHC hay un nuevo tipo 'Restricción' tal que' Eq :: * -> Restricción', y tuplas han sido promovidas a este nuevo tipo. –

Cuestiones relacionadas