2013-05-31 4 views
10

Zum Beispiel hat ParsecT mehrere Typvariablen in seiner Definition.Was ist die Regel der Reihenfolge von mehreren Variablen in Haskell?

newtype ParsecT s u m a 
    = ParsecT {unParser :: forall b . 
       State s u 
       -> (a -> State s u -> ParseError -> m b) 
       -> (ParseError -> m b)     
       -> (a -> State s u -> ParseError -> m b) 
       -> (ParseError -> m b)     
       -> m b 
      } 

Können wir das so machen?

Ich frage mich, ob es eine Regel oder ein Prinzip über die Reihenfolge der Typvariablen gibt, wenn wir einen neuen Typ definieren.

+0

Eine ähnliche Frage auf der Werteebene ist hier: http://stackoverflow.com/questions/5863128/ordering-of-parameters-to-make-use-of-currying – cheecheeo

Antwort

15

In diesem Fall ist a das letzte, weil wir möchten, dass ParsecT s u m __ eine Monade ist, auf diese Weise, was unsere Parser suchen, kann davon abhängen, was sie vorher gefunden haben, und so fort. Wenn u zuletzt kam konnten wir nicht schreiben

instance Monad m => Monad (ParsecT s u m) where ... 

m next-to-last, weil wir ParsecT s u wollen

class MonadTrans t where 
    lift :: m a -> t m a 

instance MonadTrans (ParsecT s u) where ... 

einen 'Monade Transformator' sein, wenn wir die m die erste Stelle setzen, diese Instanz wäre nicht möglich. Es scheint keinen ähnlichen Grund für die Bestellung von s und u zu geben.

+1

Wert bringen, dass "Newtype" ist manchmal verwendet, um die Reihenfolge der Typindizes zu manipulieren, so dass Sie Instanzen für 'Functor' und' Monad' auf mehreren getippten Löchern bereitstellen können. –

+0

@applicative, danke. Ich sehe jetzt. Ich habe versucht, aber es ist tatsächlich unmöglich, die Reihenfolge zu ändern und die ursprüngliche Klasseninstanzstruktur beizubehalten. – Znatz

Verwandte Themen