Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何将setter与多态类型一起使用?_Haskell_Haskell Lens - Fatal编程技术网

Haskell 如何将setter与多态类型一起使用?

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]

在这种情况下如何使用镜头(设置器)

单元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]
    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]