2013-07-25 30 views
15

Tôi đang cố gắng để hiểu được Giải thích tại Monads made difficult và tôi có một thời gian khó khăn để tìm ra định nghĩa Newtype sau:Haskell Newtype với ngoặc

newtype (FComp g f) x = FComp { unCompose :: g (f x) } 

instance (Functor b c f, Functor a b g) => Functor a c (FComp g f) where 
    fmap f (FComp xs) = FComp $ fmap (fmap f) xs 

Tôi đã nhìn thấy một nơi nào Giải thích về những gì Newtype nghĩa với một biểu thức trong ngoặc đơn thay cho khai báo kiểu. Do đó, tôi không thể tìm ra định nghĩa của hàm fmap. Tôi cũng không hiểu tại sao accessor unCompose field được định nghĩa nhưng không bao giờ được sử dụng. Tôi cảm thấy như tôi đang thiếu một số ngữ nghĩa cơ bản của newtype.

Trả lời

11

Bạn có thể viết này:

newtype (FComp g f) x = FComp { unCompose :: g (f x) } 

như vậy:

newtype FComp g f x = FComp (g (f x)) 
unCompose (FComp it) = it 

Đây là như vậy bởi vì loại ứng dụng có các thuộc tính cú pháp tương tự như các ứng dụng thông thường, ví dụ:

a b c = (a b) c 

giữ cho các giá trị a, b, c và cho các loại a, b, c.

15

Một thử nghiệm nhỏ:

newtype (FComp g f) x = FComp { unCompose :: g (f x) } 
newtype FComp2 g f x = FComp2 { unCompose2 :: g (f x) } 

*Main> :i FComp 
newtype FComp g f x = FComp {unCompose :: g (f x)} 
     -- Defined at Test.hs:34:10 
*Main> :i FComp2 
newtype FComp2 g f x = FComp2 {unCompose2 :: g (f x)} 
    -- Defined at Test.hs:35:9 

Vì vậy, các dấu ngoặc đơn thực sự không thay đổi bất cứ điều gì. Nó chỉ giống như không có chúng.

Đối với số uncompose, đó chỉ là tên để unwrap newtype mà không làm cho trình tạo dữ liệu rõ ràng. Trong đoạn trích bạn đã đăng, họ sử dụng đối sánh mẫu, nhưng không muốn xuất chi tiết triển khai, vì vậy, unCompose được cung cấp để sử dụng nội dung của FComp. Điều này cũng giống như ở định nghĩa data, chỉ rằng newtype muốn chính xác một trường thay vì 0..n.

+2

+1 để thực sự thử nghiệm. – Ingo

+0

Có thể * sẽ * muốn xuất chi tiết triển khai, ít nhất là vô cùng vì chỉ có một thứ mà họ có thể có. Đôi khi chỉ thuận tiện hơn khi sử dụng hàm giải nén hơn so khớp mẫu. –

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