2015-11-28 19 views
17

エラー処理とPrismはのは、私はこれらのかなり簡単に使用してオプティクスを表すことができレンズ/

string2int :: String -> Maybe Int 
int2string :: Int -> String 

変換関数のペアを持っているとしましょう。私は失敗の理由を表現したい場合は

stringIntPrism :: Prism String Int

しかし、私は2つの別々の機能として、これらを維持する必要があると思います。この単純な例Maybeについては

string2int :: String -> Validation [ParseError] Int 
int2string :: Int -> String` 

私たちは常にので、我々は実際にいずれかまたは検証のタイプを使用して、これをエンコードする必要はありませんが、障害が解析の障害であると仮定することができるので、完全に罰金です。

しかし、私のパースプリズムに加えて、私はいくつかの検証に

isOver18 :: Int -> Validation [AgeError] Int 
isUnder55 :: Int -> Validation [AgeError] Int 

を実行したい私が

ageField = isUnder55 . isOver18 . string2Int :: ValidationPrism [e] String Int

を持つことができるよう、一緒にこれらのものを構成できるようにするには理想的である、と想像

これは手作業で作るのはかなり簡単ですが、レンズ/オプティクスの分野にはすでにこれを行う何かが潜んでいる可能性があるという共通の概念のようです。これを処理する既存の抽象概念はありますか?

TL; DR

代わりに多分に直接接続されている任意のファンクタ上にパラメータ化することができる部分レンズ/プリズム/ ISOを実現する標準的な方法はあります?。

私は上記のHaskellの表記法を使っていますが、これはもっと簡単ですが、実際にはこれを実装するためにScalaのMonocleを使用しています。しかし、私はekmettのLensライブラリに固有の答えに満足しています。

+6

似たような質問については、何らかの方法でredditディスカッションを覚えています。その中で、Edward Kmettは(概念を述べた)(https://www.reddit。通常のレンズと合成可能な状態でエラー情報を報告することができる "共索プリズム"の "com/r/haskell/comments/34igpj/hypothetical_lens_xml_parsing_that_documents/cqv346w"明らかに、型推論の問題のためにレンズフレームワークに収まりにくいため、実装されていませんでした。 – danidiaz

+0

ここでは、トラバーサルのコンセプトが適切だと思います。 –

答えて

2

私は最近、インデックスオプティクスについてa blog postと書いています。どのようにコインテックスされた光学系を行うことができるかを少し探っています。

要約:Coindexed-opticsは可能ですが、まだそれ以上の調査をしていません。特に、そのアプローチをlensのレンズ(ProfunctorからVLまで)のコード化に変換しようとすると、それはもっと毛がいっぱいになるので(の7タイプの変数だけ)。

は現在、インデックス化された光学系が現在どのようにエンコードされているかを変更することなく、これを行うことができません。lens。ですから、今はバリデーションに特化したライブラリを使うことをお勧めします。

は困難のヒントを与えるために:私たちは Traversal秒で作曲しようとすると、我々は

-- like `over` but also return an errors for elements not matched 
validatedOver :: CoindexedOptic' s a -> (a -> a) -> s -> (ValidationErrors, s) 

または何か他のものを持っている必要がありますか? Coindexed Prismsを作成できるだけであれば、その価値はその複雑さを正当化するものではありません。光学系フレームワークに「適合」しません。

関連する問題