4

レンズが定義されたデータ構造があるとします。たとえば、次のようになります。

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もう少しエレガントなものを望んでいましたが、この特定のケースに役立つコンビネータが見つかりません。

4

1 に答える 1

4

どのレンズも表示または設定の「モード」で使用できるため、少なくともview Xレンズごとに X をl :: Lens' a b指定する必要がview lありa -> bますMonadReader

Applicativeしたがって、インスタンス forを使用して繰り返しの一部を取り除くことができます((->) a)

thing & fun <$> view c <*> view a <*> view d <*> view b
于 2013-07-22T19:58:09.467 に答える