Koz*_*oss 5 haskell haskell-lens
我有一个内部细节被隐藏的类型。我想提供某种镜头,可以在特定索引处读取所述类型的元素,但不修改它们。我的类型的实例Ixed似乎没有执行我想要的操作,因为它明确允许修改(尽管不允许插入或删除)。如果我想允许只读索引,我不确定我使用什么。
如果你想定义只读镜头,你应该使用Gettertype. 让我们首先考虑简单的例子。您可以使用^?和ix函数按索引访问元素。
\xce\xbb: [1..] ^? ix 10\nJust 11\n\xce\xbb: import qualified Data.Map as M\n\xce\xbb: M.empty ^? ix \'a\'\nNothing\n\xce\xbb: M.singleton \'a\' 3 ^? ix \'a\'\nJust 3\nRun Code Online (Sandbox Code Playgroud)\n\n这是一个如何使用标准镜头访问索引数据结构的示例。这些知识应该足以定义您自己的只读索引 getter,但我将给出扩展的示例。
\n\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TemplateHaskell #-}\n\nimport Control.Lens\n\ndata MyData = MkData\n { _innerList :: [Int]\n , _dummyField :: Double\n }\n\nmakeLenses \'\'MyData\n\nindexedGetter :: Int -> Getter MyData (Maybe Int)\nindexedGetter i = innerList . to (^? ix i)\nRun Code Online (Sandbox Code Playgroud)\n\n现在在 ghci 中你可以使用这个 getter。
\n\n\xce\xbb: let exampleData = MkData [2, 1, 3] 0.3 \n\xce\xbb: exampleData ^. indexedGetter 0\nJust 2\n\xce\xbb: exampleData & indexedGetter 0 .~ Just 100\n\n<interactive>:7:15:\n No instance for (Contravariant Identity)\n arising from a use of \xe2\x80\x98indexedGetter\xe2\x80\x99\n In the first argument of \xe2\x80\x98(.~)\xe2\x80\x99, namely \xe2\x80\x98indexedGetter 0\xe2\x80\x99\n In the second argument of \xe2\x80\x98(&)\xe2\x80\x99, namely\n \xe2\x80\x98indexedGetter 0 .~ Just 100\xe2\x80\x99\n In the expression: exampleData & indexedGetter 0 .~ Just 100\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |