在嘗試將具有多層函子的函式應用于主機資料結構的成員時,如下例所示:
update ::
(SomeProductField -> Maybe (Int, SomeProductField)) ->
(SomeProduct -> Maybe (Int, SomeProduct))
我想出了以下實用程式:
inFunctor :: Functor f => Lens s t a b -> Lens s (f t) a (f b)
inFunctor lens f = getCompose . lens (Compose . f)
允許我實作這樣的update功能:
someProductFieldLens :: Lens' SomeProduct SomeProductField
update = inFunctor someProductFieldLens
我想知道像這樣的東西是否已經存在于“鏡頭”中,以及是否可以以其他方式使用現有手段實作同樣的目標。
uj5u.com熱心網友回復:
可能沒有多少標準方法,但無論如何:alaf可以處理Compose包裝。例如:
data SomeProduct = SomeProduct
{ _someProductField :: Bool
, _anotherProductField :: String
}
deriving Show
makeLenses ''SomeProduct
ghci> alaf Compose someProductField (\b -> Just (fromEnum b, not b)) (SomeProduct False "foo")
Just (0,SomeProduct {_someProductField = True, _anotherProductField = "foo"})
如果您仍然想定義通用組合器:
inFunctor :: Functor f => Lens s t a b -> Lens s (f t) a (f b)
inFunctor l = alaf Compose l
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398729.html
上一篇:這個二元函式子集有名字嗎?
