2013-05-31 39 views
10

Ví dụ, ParsecT có nhiều biến kiểu trong định nghĩa của nó.Quy tắc của thứ tự của nhiều biến kiểu trong haskell là gì?

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 
      } 

Chúng ta có thể làm như thế này không?

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 
      } 

Tôi tự hỏi liệu có nguyên tắc hoặc nguyên tắc về thứ tự của các biến kiểu khi chúng tôi xác định loại mới hay không.

+0

Một câu hỏi tương tự ở cấp độ giá trị là ở đây: http://stackoverflow.com/questions/5863128/ordering-of-parameters-to-make-use-of-currying – cheecheeo

Trả lời

15

Trong trường hợp này, a là cuối cùng vì chúng tôi muốn ParsecT s u m __ là một đơn nguyên, theo cách đó, những gì mà trình phân tích cú pháp của chúng tôi tìm kiếm có thể phụ thuộc vào những gì họ đã tìm thấy trước đây, v.v. Nếu u đến cuối cùng chúng tôi không thể viết

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

m là next-to-cuối cùng vì chúng tôi muốn ParsecT s u trở thành một 'biến đơn nguyên'

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

instance MonadTrans (ParsecT s u) where ... 

Nếu chúng ta đặt các m đầu tiên, trường hợp này sẽ không thể. Dường như không có bất kỳ lý do tương tự nào cho việc đặt hàng của su.

+1

Đáng giá lên rằng 'newtype' đôi khi được sử dụng hoàn toàn để thao tác thứ tự của các chỉ mục kiểu để bạn có thể cung cấp các cá thể cho 'Functor' và' Monad' trên nhiều lỗ đã gõ. –

+0

@applicative, cảm ơn bạn. Tôi hiểu rồi. Tôi đã thử nhưng nó thực sự là không thể thay đổi thứ tự và bảo tồn cấu trúc thể hiện lớp gốc. – Znatz

Các vấn đề liên quan