2012-01-27 2 views
21

Souvent, lorsque je joue avec du code Haskell, je crée des annotations de type undefined.Non défini au niveau du type

foo :: String -> Int 
foo = undefined 

Existe-t-il un type "indéfini" au niveau du type que je pourrais utiliser de la même manière?

(Idéalement, en liaison avec une annotation de type)

type Foo :: * -> * 
type Foo = Undefined 

Une réflexion sur le même fil: est-il un moyen pour moi de bouchonner cas pour les types créés de cette façon classe de types? Un moyen encore plus facile que la voie théorique suivante?

instance Monad Foo where 
    return = undefined 
    (>>=) = undefined 

Répondre

24

Vous pouvez utiliser EmptyDataDecls à bouchonner un type, et KindSignatures vous pouvez lui donner une sorte:

{-# LANGUAGE EmptyDataDecls, KindSignatures #-} 

data Foo :: * -> * 

Vous pouvez également bouchonner l'instance Monad sans avertissement avec cette option pour GHC.

{-# OPTIONS_GHC -fno-warn-missing-methods #-} 

instance Monad Foo 

Et vous n'avez pas besoin de quitter toute mise en œuvre pour return et >>=.

+1

Nice! Exactement ce que je cherchais; c'est encore plus pratique car vous n'avez pas besoin d'écrire 'Foo = Undefined'! Et de gentilles signatures! Sauce extraordinnaire. –

+0

Je crois que ce n'est pas la même chose qu'un alias de type - quand vous introduisez une nouvelle donnée, il n'y a aucune chance que 'Foo a = a'. Donc, ce n'est pas la même chose que le code de la question, ce qui peut être bien. – gatoatigrado

+0

@gatoatigrado: Je pense que l'exigence était juste un espace réservé pour un type à écrire, pas un alias de type en soi, et c'est une solution appropriée. Quoi qu'il en soit, heureux de vous aider Dan! – danr

Questions connexes