给定一些定义了透镜的数据结构,例如:
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