4

给定一些定义了镜头的数据结构,例如:

import Control.Lens

data Thing =
  Thing {
    _a :: String
  , _b :: String
  , _c :: Int
  , _d :: Int
  }

makeLenses ''Thing

并给出一些我想使用几个 getter 调用的函数,例如:

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 bview l都有一个类型,比如a -> b你翻译一些MonadReader噪音。

Applicative因此,我们可以使用for 的实例摆脱一些重复((->) a)

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