带括号的Haskell newtype

我正在努力理解Monads made difficult的解释,我很难弄清楚以下新的类型定义:

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字段访问器被定义但从未使用过.我觉得我缺少一些新的基本语义.

你可以写这个:

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.

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/17853232/haskell-newtype-with-parentheses

转载注明原文:带括号的Haskell newtype