エラー処理と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ライブラリに固有の答えに満足しています。
似たような質問については、何らかの方法でredditディスカッションを覚えています。その中で、Edward Kmettは(概念を述べた)(https://www.reddit。通常のレンズと合成可能な状態でエラー情報を報告することができる "共索プリズム"の "com/r/haskell/comments/34igpj/hypothetical_lens_xml_parsing_that_documents/cqv346w"明らかに、型推論の問題のためにレンズフレームワークに収まりにくいため、実装されていませんでした。 – danidiaz
ここでは、トラバーサルのコンセプトが適切だと思います。 –