如何在镜头中获得功能类型检查

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)

那么如何既getConstr Const获得的由给a -> b

lef*_*out 8

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)