use*_*134 1 dictionary haskell haskell-lens
我有以下程序:
{-# LANGUAGE TemplateHaskell #-}
import qualified Data.Map.Strict as Map
import Control.Lens
data MyLabel = MyLabel { _label :: String } deriving (Show, Eq, Ord)
data MyMap = MyMap { _vals :: Map.Map String MyLabel } deriving (Show, Eq, Ord)
makeLenses ''MyLabel
makeLenses ''MyMap
sample :: MyMap
sample = MyMap { _vals = Map.fromList [("foo", MyLabel "bar")] }
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何f使用镜头进行转换,以便:
f sample "quux" == MyMap { _vals = Map.fromList [("foo", MyLabel "quux")] }
Run Code Online (Sandbox Code Playgroud)
我了解到atLens库中的函数应该用于修改Maps,所以我试图做这样的事情:
sample ^. vals & at "foo" . label .~ Just "quux"
Run Code Online (Sandbox Code Playgroud)
但这会产生一条错误信息,这对我来说是不可理解的.这样做的正确方法是什么?
试试这个尺码:
{-# LANGUAGE TemplateHaskell #-}
module Main where
import qualified Data.Map.Strict as Map
import Control.Lens
data MyLabel =
MyLabel { _label :: String } deriving (Show, Eq, Ord)
data MyMap =
MyMap { _vals :: Map.Map String MyLabel } deriving (Show, Eq, Ord)
makeLenses ''MyLabel
makeLenses ''MyMap
sample :: MyMap
sample =
MyMap (Map.fromList [("foo", MyLabel "bar")])
main :: IO ()
main =
print (sample & (vals . at "foo" . _Just . label .~ "quux"))
Run Code Online (Sandbox Code Playgroud)
请记住,在设置时,您正在尝试构建类型的函数MyMap -> MyMap.你这样做的方法是将一堆光学器件链接在一起(vals . at "foo" . _Just . label)然后选择一个setter操作(.~).你不能混合和匹配getter操作,就像^.setter操作一样.~!所以每个setter或多或少都是这样的:
foo' = (optic1 . optic2 . optic3 . optic4) .~ value $ foo
-- _________this has type Foo -> Foo___________
Run Code Online (Sandbox Code Playgroud)
为了提高我们使用的可读性&,翻译版本$:
foo' = foo & (optic1 . optic2 . optic3 . optic4) .~ value
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
614 次 |
| 最近记录: |