我试图理解Monads中的解释变得困难,我很难搞清楚以下新类型的定义:
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
Run Code Online (Sandbox Code Playgroud)
我无处可见解释newtype的含义是用括号中的表达式代替类型声明.因此,我无法弄清楚fmap函数的定义是什么意思.我也不明白为什么定义unCompose字段访问器但从未使用过.我觉得我缺少一些newtype的基本语义.
fir*_*dle 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
Run Code Online (Sandbox Code Playgroud)
所以括号真的不会改变任何东西.没有它们就是一样的.
至于uncompose它,它只是一个名称来展开newtype而不使数据构造函数显式.在您发布的片段中,他们使用模式匹配,但是人们不希望导出实现细节,因此unCompose提供使用的内容FComp.这与data定义相同,只需要newtype一个字段而不是0..n.
Ing*_*ngo 11
你可以这样写:
newtype (FComp g f) x = FComp { unCompose :: g (f x) }
Run Code Online (Sandbox Code Playgroud)
像这样:
newtype FComp g f x = FComp (g (f x))
unCompose (FComp it) = it
Run Code Online (Sandbox Code Playgroud)
这是因为类型应用程序具有与普通应用程序相同的语法属性,即:
a b c = (a b) c
Run Code Online (Sandbox Code Playgroud)
保留值a,b,c和类型a,b,c.