2013-07-25 4 views
15

Я пытаюсь понять объяснения в Monads made difficult и у меня трудно понять, следующее определение NewType:Haskell 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 

Я нигде не видел объяснения того, что Newtype означает, с выражением в скобках вместо объявления типа. Поэтому я не могу понять, что означает определение функции fmap. Я также не понимаю, почему атрибут доступа unCompose определен, но никогда не используется. Я чувствую, что мне не хватает базовой семантики нового типа.

ответ

11

Вы могли бы написать это:

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

так:

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

Это так, потому что приложение типа имеет те же синтаксические свойства как обычные приложения, то есть:

a b c = (a b) c 

выполняется для значений a, b, c и для типов a, b, c.

15

Небольшой тест:

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 

Так круглые скобки действительно ничего не изменится. Это точно так же, как без них.

Что касается uncompose, это просто имя для разворачивания newtype без явного указания конструктора данных. В опубликованном фрагменте они используют сопоставление шаблонов, но не хотят экспортировать детали реализации, поэтому unCompose предоставляется для использования содержимого FComp. Это точно так же, как в определениях data, только newtype хочет ровно одно поле вместо 0..n.

+2

+1 для фактического тестирования. – Ingo

+0

Возможно, что * хотел бы экспортировать детали реализации, по крайней мере, поскольку есть только одно, что они могут быть. Иногда удобнее использовать функцию распаковки, чем сопоставление шаблонов. –

Смежные вопросы