2013-07-25 23 views
15

Próbuję zrozumieć wyjaśnieniu w Monads made difficult i mam twardy czas na zastanawianie się następującą definicję newtype:Haskell newtype z nawiasami

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 

ja nigdzie nie widział wyjaśnieniu, co oznacza newtype z wyrazem w nawiasie zamiast deklaracji typu. Dlatego nie mogę zrozumieć, co oznacza definicja funkcji fmap. Nie rozumiem także, dlaczego nieokreślony akcesor pola jest zdefiniowany, ale nigdy nie jest używany. Czuję, że brakuje mi podstawowej semantyki nowości.

Odpowiedz

11

można napisać tak:

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

tak:

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

Jest tak dlatego, że aplikacja typu ma takie same właściwości składniowe jak zwykłych aplikacji, tj:

a b c = (a b) c 

trzyma dla wartości a, b, c oraz dla typów a, b, c.

15

mały 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 

Więc nawiasy naprawdę niczego nie zmieni. Jest tak samo jak bez nich.

Jeśli chodzi o uncompose, jest to po prostu nazwa, aby odwijać newtype bez wyraźnego wyrażenia konstruktora danych. W opublikowanym fragmencie używasz dopasowywania wzorców, ale nie chcesz eksportować szczegółów implementacji, więc unCompose jest dostarczany do korzystania z zawartości FComp. To jest dokładnie to samo, co w definicjach data, tyle tylko, że newtype chce dokładnie jedno pole zamiast 0..n.

+2

+1 za faktyczne testowanie. – Ingo

+0

Jeden prawdopodobnie * chciałby * wyeksportować szczegóły implementacji, przynajmniej dlatego, że istnieje tylko jedna rzecz, którą mogą być. Czasami wygodniej jest korzystać z funkcji rozpakowywania niż dopasowywania wzorców. –

Powiązane problemy