有人声称这newtype T a = T (a -> Int)
是一个类型构造函数,它不是函子(而是逆变函子)。为何如此?或什么是逆函子(因此我很清楚为什么不能将其设为普通函子)?
给定
newtype T a = T (a -> Int)
让我们尝试Contravariant
为此数据类型构建实例。
这是有问题的类型类:
class Contravariant f where
contramap :: (a -> b) -> f b -> f a
基本上,contramap
是类似于fmap
,但而不是提升的功能a -> b
到f a -> f b
,它抬起它f b -> f a
。
让我们开始编写实例...
instance Contravariant T where
contramap g (T f) = ?
在填写之前?
,我们先考虑一下g
和的类型f
:
g :: a -> b
f :: b -> Int
为了清楚起见,我们不妨提到
f a ~ T (a -> Int)
f b ~ T (b -> Int)
因此我们可以填写?
以下内容:
instance Contravariant T where
contramap g (T f) = T (f . g)
是超级迂腐,你可能会重命名g
为aToB
和f
作为bToInt
。
instance Contravariant T where
contramap aToB (T bToInt) = T (bToInt . aToB)
您可以为编写Contravariant
实例的原因T a
归结a
为在中处于相反位置的事实T (a -> Int)
。说服自己T a
不是最好的方法Functor
是尝试(失败)自己编写Functor
实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句