4

レンズを理解するためにこの投稿を読んでいます。最初に、次のような型シノニムを定義します。

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 Constget の両方が を与えるためにどのように構成されるのでしょうa -> bか?

4

2 に答える 2

4

レンズの種類を理解する 1 つの方法

type Lens s a = forall f . Functor f => (a -> f a) -> (s -> f s)

「(焦点を当てた)サブパートをいくつかFunctorに入れる方法を教えてくれたら、全体をその中に入れる方法を教えてくれる」と読むことですFunctor。ただし、レンズを使用するforall人が を選択できるため、いたずらをすることができます。Functor

これConst Functorは、2 つの型パラメーターがあるという点でトリックですが、2 番目Functorの型パラメーターに対してFunctorial を指定していますが、実際には最初の型パラメーターの値しか含まれていません。

newtype Const real fake = Const { getConst :: real }

したがって、コンストラクターConstは関数です

Const :: real -> Const real fake

これは、ラップされている実際の値Functorを隠し、あらゆるタイプを運ぶふりをする になりますfake


明確にするために、FunctorインスタンスはConst次のようになります

instance Functor (Const b) where
  fmap _ (Const b) = Const b

言い換えれば、fmap基本的にノーオペレーションです。


Constそれでは、レンズに渡すとどうなるか見てみましょう。

l       :: Lens s a
Const   :: a -> Const a a
l Const :: s -> Const a s

言い換えれば、Lens はだまされて、サブパート を注入aConst、全体パート を無視しましたs。次に、それを で抽出しgetConstます。

getConst :: Const real fake -> real

getConst . l Const :: s -> a
于 2014-04-07T14:04:27.213 に答える