Haskell 如何将setter与多态类型一起使用?
在这种情况下如何使用镜头(设置器) 单元A:Haskell 如何将setter与多态类型一起使用?,haskell,haskell-lens,Haskell,Haskell Lens,在这种情况下如何使用镜头(设置器) 单元A: data Xxx a = Xxx { _xxxAaa :: Int, _xxxBbb :: a } makeFields ''Xxx 模块B: t :: IO Bool t = do let n = "aaa" :: String let xs = [Xxx 0 0, Xxx 1 1] :: [Xxx Int] ys = [set bbb n $ x | x <- xs]
data Xxx a = Xxx {
_xxxAaa :: Int,
_xxxBbb :: a
}
makeFields ''Xxx
模块B:
t :: IO Bool
t = do
let n = "aaa" :: String
let xs = [Xxx 0 0, Xxx 1 1] :: [Xxx Int]
ys = [set bbb n $ x | x <- xs]
pure False
顺便说一句,这个技巧适用于元组(它们也是多态的),但不适用于这种类型。由
makeFields
生成的hasbbbb
类不提供类型更改镜头:
ghci> :i HasBbb
class HasBbb s a | s -> a where
bbb :: Lens' s a
{-# MINIMAL bbb #-}
-- Defined at A.hs:14:1
instance HasBbb (Xxx a) a -- Defined at A.hs:14:1
将其与由makelens
生成的特定镜头进行对比:
data Xxx a = Xxx {
_xxxAaa :: Int,
_xxxBbb :: a
}
makeFields ''Xxx
makeLenses ''Xxx
data Xxx a = Xxx {
_xxxAaa :: Int,
_xxxBbb :: a
}
makeFields ''Xxx
makeLenses ''Xxx
ghci> :i xxxBbb
xxxBbb :: Lens (Xxx a1) (Xxx a2) a1 a2 -- Defined at A.hs:15:1
ghci> :t set xxxBbb "aaa" (Xxx 0 0)
set xxxBbb "aaa" (Xxx 0 0) :: Xxx [Char]