たとえば、レンズが定義されたデータ構造があるとします。
import Control.Lens
data Thing =
Thing {
_a :: String
, _b :: String
, _c :: Int
, _d :: Int
}
makeLenses ''Thing
そして、いくつかのゲッターを使用して呼び出したい関数を考えます。たとえば、次のようになります。
fun :: Int -> String -> Int -> String -> Bool
fun = undefined
現時点では、各フィールドにアクセスするための親が醜くなります。たとえば、次のようになります。
thing = Thing "hello" "there" 5 1
answer = fun (thing^.c) (thing^.a) (thing^.d) (thing^.b)
lens
他のほとんどの状況でのライブラリの簡潔さを考えると、もう少しエレガントなものを望んでいましたが、この特定のケースに役立つコンビネータを見つけることができません。
どのレンズも表示または「モード」の設定で使用できるため、少なくともview X
レンズXごとに指定する必要があります。ただし、どのレンズl :: Lens' a b
でview l
もa -> b
、MonadReader
ノイズの一部を変換するようなタイプがあります。
したがって、のApplicative
インスタンスを使用して、繰り返しの一部を取り除くことができます((->) a)
。
thing & fun <$> view c <*> view a <*> view d <*> view b
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加