2012-01-27 16 views
21

Spesso quando sto giocando con il codice Haskell, interrompo le cose con un'annotazione di tipo e undefined.Non definito a livello di tipo

foo :: String -> Int 
foo = undefined 

Esiste un livello di tipo "non definito" che potrei utilizzare in modo simile?

(Idealmente, in combinazione con un tipo di annotazione)

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

Ulteriori pensiero sullo stesso thread: c'è un modo per me di spegnere typeclass casi per i tipi creati in questo modo? Un modo ancora più semplice del seguente modo teorico?

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

risposta

24

È possibile utilizzare EmptyDataDecls per spegnere un tipo, e con KindSignatures si può dare una sorta:

{-# LANGUAGE EmptyDataDecls, KindSignatures #-} 

data Foo :: * -> * 

È inoltre possibile spegnere l'istanza Monad senza avvisi con questa opzione per GHC.

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

instance Monad Foo 

E poi non c'è bisogno di lasciare qualsiasi implementazione per return e >>=.

+1

Bello! Esattamente quello che stavo cercando; è ancora più conveniente perché non devi scrivere 'Foo = Undefined'! E le firme gentili! Salsa stupenda. –

+0

Credo che non sia lo stesso di un alias di tipo - quando si introduce un nuovo dato, non c'è alcuna possibilità che 'Foo a = a'. Quindi, non è lo stesso del codice della domanda, che potrebbe andare bene. – gatoatigrado

+0

@gatoatigrado: Penso che il requisito fosse solo un segnaposto per un tipo ancora da scrivere, non un alias di tipo per sé, e quindi questa è una soluzione appropriata. Ad ogni modo, felice di aiutarti Dan! – danr