我一直在读这篇文章以了解镜头.他们最初定义一个类型同义词,如下所示:
type RefF a b = forall f. Functor f => (b -> f b) -> (a -> f a)
Const的定义如下:
newtype Const a b = Const { getConst :: a }
get
功能类型检查如何:
get :: RefF a b -> a -> b get r = getConst . r Const
getConst的类型是这样的:
getConst :: Const a b -> a
r Const
我猜的类型是这样的:
r Const = (b -> f b) -> (Const -> f Const)
那么如何既getConst
与r Const
获得的由给a -> b
?
r
通过用const仿函数代替得到的类型f
; 因为我们需要一个b
必须是第一个参数的结果(x
实际上只在Const x y
类型中找到)
r :: (b -> Const b b) -> (a -> Const b a)
现在论证很简单:那只是Const
构造函数.
r Const :: a -> Const b a
如果你用后期撰写,getConst :: Const b a -> b
最终会得到
getConst . r Const :: a -> b