2013-05-31 68 views
10

例如,ParsecT在其定義中有多個類型變量。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 
      } 

我們可以這樣做嗎?

newtype ParsecT m a s u  -- Only the order of s u m a is changed to m a s u. 
    = 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 
      } 

我想知道當我們定義一個新類型時,是否存在關於類型變量順序的規則或原則。

+0

在價值水平的類似問題在這裏:http://stackoverflow.com/questions/5863128/ordering-of-parameters-to-make-use-of-currying – cheecheeo

回答

15

在這種情況下,a是最後一個,因爲我們希望ParsecT s u m __成爲monad,那麼,我們的解析器查找的內容可能取決於他們之前找到的內容等等。如果u排在最後,我們可以不寫

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

m是下一個到最後一個,因爲我們希望ParsecT s u是一個「單子轉換」

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

instance MonadTrans (ParsecT s u) where ... 

如果我們把m第一,這種情況下將不可能。 su的排序似乎沒有任何類似的原因。

+1

值得提出的'newtype'有時純粹用於操縱類型索引的順序,以便您可以在多個類型的孔上提供'Functor'和'Monad'的實例。 –

+0

@applicative,謝謝。我現在明白了。我試過了,但實際上不可能改變順序並保留原來的類實例結構。 – Znatz

相關問題