2011-04-09 3 views
3

Je voudrais avoir une classe de types de types qui peuvent éventuellement être castés vers d'autres types lorsque c'est possible.Comment faire des classes de types spécialisées pour certains types, l'implémentation par défaut pour le reste des types

class Castable a b where 
    cast :: a -> Maybe b 
    cast _ = Nothing -- default implementation 

Maintenant, la classe serait mis en œuvre pour certains types et pour tous les autres je voudrais avoir la mise en œuvre par défaut.

Comment on peut faire ça?

Répondre

6

Il est pas nécessairement une chose sûre ou Haskell-y faire, mais il est certainement possible, en utilisant OverlappingInstances

D'abord, leur permettre:

{-# LANGUAGE MultiParamTypeClasses #-} 
{-# LANGUAGE FlexibleInstances  #-} 
{-# LANGUAGE OverlappingInstances #-} 

Écrivez votre classe de coulée:

class Castable a b where 
    cast :: a -> Maybe b 
    cast _ = Nothing -- default implementation 

Une instance "optimisée":

instance Castable Int Bool where 
     cast 0 = Just False 
     cast _ = Just True 

et enfin, une instance générale pour tous les types:

instance Castable a b where 

Exemple d'utilisation:

main = do 
    print $ (cast (7 :: Int) :: Maybe Bool) 
    print $ (cast (7 :: Int) :: Maybe Integer) 

L'exécution de cette, la valeur par défaut est choisie lorsque les types ne sont pas spécialisés:

*Main> main 
Just True 
Nothing 
+0

Dans mon cas aussi {- # LANGUAGE IncoherentInstances # -} étaient nécessaires, mais c'est la réponse à ma question. Merci! – Tener

+0

Salut Don - comment l'instance particulière est-elle choisie? c'est-à-dire que GHC décide toujours d'utiliser l'instance la plus spécifique, en particulier en présence de modules séparés? Il y a un mois ou deux, il y avait un fil à propos de cela sur Haskell Cafe, mais personne n'a fourni de réponse. –

+1

Selon la documentation: "L'indicateur -XOverlappingInstances indique à GHC de permettre la correspondance de plusieurs instances, à condition qu'il y en ait une plus spécifique.S'il n'y a pas de correspondance la plus spécifique, le programme est rejeté." –

Questions connexes