2013-05-31 31 views
10

Na przykład ParsecT zawiera wiele zmiennych typu w swojej definicji.Jaka jest reguła porządku wielu zmiennych typu w 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 
      } 

Czy możemy to zrobić w ten sposób?

Zastanawiam się, czy istnieje zasada lub zasada dotycząca kolejności zmiennych typu, gdy definiujemy typ nowy.

+0

Podobne pytanie na poziomie wartości znajduje się tutaj: http://stackoverflow.com/questions/5863128/ordering-of-parameters-to-make-use-of-currying – cheecheeo

Odpowiedz

15

W tym przypadku, a jest ostatnim, ponieważ chcemy, aby ParsecT s u m __ było monadą, w ten sposób to, czego szukają nasi parserzy, zależy od tego, co znaleźli wcześniej i tak dalej. Jeśli u przyszedł ostatni nie mogliśmy napisać

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

m jest obok przedostatniej ponieważ chcemy ParsecT s u być „transformator monada”

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

instance MonadTrans (ParsecT s u) where ... 

jeśli stawiamy m pierwsze, to wystąpienie nie byłoby możliwe. Nie ma żadnego podobnego powodu dla zamawiania s i u.

+1

Warto zwrócić uwagę, że 'newtype' jest czasem używane wyłącznie do manipulowania porządkiem indeksów typów, aby można było podać instancje dla 'Functor' i' Monad' na wielu wpisanych dziurach. –

+0

@aplikacyjny, dziękuję. Teraz widzę. Próbowałem, ale nie można zmienić kolejności i zachować oryginalnej struktury instancji klasy. – Znatz

Powiązane problemy