使用Control.Lens中的几个Getter调用函数的干净方法是什么



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

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

目前,我使用parens访问每个字段时遇到了很多问题,例如:

thing = Thing "hello" "there" 5 1
answer = fun (thing^.c) (thing^.a) (thing^.d) (thing^.b)

考虑到lens库在大多数其他情况下的简洁性,我希望有一些更优雅的东西,但我找不到任何组合子来帮助这个特定的情况。

由于任何镜头都可以在观看或设置"模式"中使用,我们至少需要为每个镜头X指定view X。但对于任何镜头l :: Lens' a b,如果平移一些MonadReader噪声,则view l的类型与a -> b类似。

因此,我们可以使用((->) a)Applicative实例来消除一些重复。

thing & fun <$> view c <*> view a <*> view d <*> view b

最新更新