在 8.3 节中,Bartosz 定义了这种类型
newtype BiComp bf fu gu a b = BiComp (bf (fu a) (gu b))
在这里,如果我对 Haskell有所了解bf
,fu
, 和gu
是类型构造函数,类型为bf
kind(* -> *) -> (* -> *) -> * -> * -> *
和fu
and (就像or一样),而, 和是 kind 的一般类型;左边是一个类型构造函数,写起来很长,而右边是一个值构造函数,所以它是 type 。gu
* -> *
Maybe
[]
a
b
*
BiComp
=
BiComp
(bf (fu a) (gu b)) -> BiComp bf fu gu a b
然后作者在and中做BiComp
了一个双函子,前提是类型构造函数参数也是 a ,并且类型构造函数and是s:a
b
bf
Bifunctor
fu
gu
Functor
instance (Bifunctor bf, Functor fu, Functor gu) => Bifunctor (BiComp bf fu gu) where
bimap f1 f2 (BiComp x) = BiComp ((bimap (fmap f1) (fmap f2)) x)
到目前为止一切顺利,在这一点上对我来说一切似乎都是合理的。除了对类型构造函数和值构造函数使用相同的名称可能会让我迷失方向。
现在我很想提出以下意见:
bimap
定义右侧的那个是利用约束的那个:它是bimap
假定在Bifunctor
任何类型的构造函数的实例中定义的那个bf
,因此它bimap
有 type(a -> a') -> (b -> b') -> bf a b -> bf a' b'
;我认为这没有下面的那么有趣,因为它毕竟只是8.1 中呈现bimap
的Bifunctor
类型的签名;class
- 相反,
bimap
左边的 是我们在其第 4 和第 5 个参数中定义BiComp
的;Bifunctor
以及参数f1
和f2
是必须作用于类型实体的函数,这些实体是 的第 4 个和第 5 个参数BiComp
;因此, thisbimap
的类型是(a -> a') -> (b -> b') -> BiComp bf fu gu a b -> BiComp bf fu gu a' b'
。
它是否正确?
如果是这样,那么我不明白以下内容
bimap :: (fu a -> fu a') -> (gu b -> gu b') -> bf (fu a) (gu b) -> bf (fu a') (gu b')
因为这是bimap
右边的类型,我在上面的要点中写的那个,除了它是用a
= fu a
,a'
=等写fu a'
的。
我是否遗漏了什么(或过度思考......)?