「オプション」のファンラーホーフェン表現はありますか


15

多くのタイプの光学系には、ファンラーホーフェンの表現があります。

たとえばLens、タイプのa は次のLens s t a b ように表すことができます。

 Functor f => (a -> f b) -> s -> f t

同様にTraversal、は同様の方法で表すことができ、Functor制約をApplicative次のように入れ替えます。

 Applicative f => (a -> f b) -> s -> f t

MonocleArrowなどのいくつかの光学フレームワークは、というタイプを定義しますOptional

Monocleの光学では、階層 OptionalLensとの間に適合しますTraversal

私が理解しているように:a Traversal0から多くのターゲットをLens持つ可能性がある aのような場合、は0から1のターゲットを持つ可能性があるOptional aのようなものです。Lens

Monocleでは、Optional関数のペアとして定義されます。

getOrModify :: s -> Either t a 
set :: (b, s) -> t

モノクルのソースコード内のコメントは、それが表現することも可能ですことを示唆しているOptional「として弱いPLensと弱いですPPrism

Optionalファンラーホーフェン関数として表すことはできますか?

回答:


10

Functor / Applicative / Monad階層がより細かい場合、それを表現する方法があるでしょう。特に:

class Functor f => Pointed f where
    pure :: a -> f a

type Optional s t a b = forall f. Pointed f => (a -> f b) -> s -> f t

型がAffineクラスライブラリにきちんと含まれている場合、その型はおそらくレンズライブラリで名前が付けられることに注意してください。


1
これは、ユースケースにとっては便利で完全に問題ありません。これは、ファンクター階層をゼロから作成した「ちょうど楽しみ」のScala Opticsライブラリであり、したがって、私が好きなことを何でも実行できます。私は、これは私もの間、別の種類のクラスがあった場合ことを示唆していることを右の思考で午前FunctorApplicativeliftA2、ない純粋に、そしてそれがで視神経を定義し、多くの1つのターゲット?名前はありますか?
Joe

1
それはそれを示唆しています。光学素子が何と呼ばれるか私にはわかりません。
カール・

4
@Joeその中間クラスはApply「semigroupoids」パッケージで呼び出されます。hackage.haskell.org/package/semigroupoids-5.3.3/docs/...
danidiaz

2
...そしてlensパッケージ内の対応する光学素子が呼び出されますTraversal1
ベンジャミンホジソン

@Carlこれtype Optional s t a bが実際にその光学系の正しい表現であること、およびすべての適切な法律が満たされていることをどのように確認できますか?これは魔法のトリックのようです。なぜそれをしたPointed、とではない、と言いますかCopointed?別の与えられた光学系について、正しい検察官の表現をどうやって推測できますか?
winitzki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.