2013-07-25 27 views
15

ben Monads made difficult yılında bir açıklaması anlamaya çalışıyorum ve aşağıdaki newtype tanımını bulmaktan zor zamanlar vardır: Ben hiçbir yerde bir ifadeyle ne anlama newtype bir açıklamasını yapınız gördükHaskell newtype

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 

tip beyanının yerine parantez içinde. Bu yüzden fmap işlevinin ne anlama geldiğini anlayamıyorum. Ayrıca, unCompose alan erişimcisinin neden tanımlandığını, ancak hiç kullanılmadığını anlamıyorum. Yeni türden bazı temel anlambilim eksik gibi hissediyorum.

cevap

11

Bu yazabiliriz:

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

Bu böyledir tip uygulama sıradan uygulamalar gibi aynı sözdizimsel özellikleri, yani çünkü:

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

şöyle

a b c = (a b) c 

a, b, c değerleri için a, b, c türlerini tutar. Gerçekte test etmek için

15

küçük bir test:

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 

Yani parantez gerçekten bir şey değişmez. Sadece onlarsız olarak aynı.

uncompose'a gelince, yalnızca newtype veri yapıcısını açık bir şekilde oluşturmadan açmak için bir addır. Yayınladığınız pasajda, desen eşlemesi kullanılır, ancak uygulama ayrıntılarını vermek istemezsiniz, bu nedenle , FComp'un içeriğini kullanmak için sağlanır. Bu sadece data tanımlarıyla aynıdır, yalnızca newtype0..n yerine bir alan ister.

+2

+1. – Ingo

+0

Muhtemelen * uygulama ayrıntılarını vermek ister, en azından olabileceği tek bir şey olduğu kadar. Paket eşleştirme işlevinden desen açma işlevinden daha kolay kullanılır. –