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