镜头如何处理脱糖字段是关键字的情况?我似乎记得读过一些特别的东西,但是我不记得我在哪里阅读它或者“镜头”访问者的名字最终会是什么。
请考虑以下事项:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
import Control.Monad.IO.Class (liftIO)
import Data.Maybe
import Data.Aeson
import Data.Aeson.TH
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as LC8
import qualified Data.Text.Lazy.Encoding as TLE
data Typ = Typ {
_fld1 :: BS.ByteString
, _type :: Int
} deriving (Show)
$(deriveJSON tail ''Typ)
$(makeLenses ''Typ)
main = do
print $ typ^.fld1
print $ typ^.getType
where
jsonTyp = "{\"fld1\": \"Test\", \"type\": 1 }"
typ' = decode jsonTyp :: Maybe Typ
typ = fromJust typ'
getType :: Getter Typ Int
getType = to _type
调用_type
访问者的内容是什么?如何避免在此处实施getType
?
我不得不在哈斯克尔学校打击这个,因为我在这里无法访问适当的开发环境,但我认为它可能对其他人有用。我可以添加一个答案,当我可以进入ghci并做一个:browse
(如果这给出答案),但同时有人知道吗?
谢谢大家,根据爱德华的建议,我会使用makeLensesWith
以及关键字到替换的映射。
答案 0 :(得分:12)
它没有做任何特别的事情。生成的镜头被命名为type
并且有趣的是,GHC看起来非常酷。如果您使用完全限定名称,甚至可以使用它:
{-# LANGUAGE TemplateHaskell #-}
module Foo where
import Control.Lens
data Bar = Bar { _type :: String }
deriving Show
$(makeLenses ''Bar)
> :l Foo
> :t type -- Um...
<interactive>:1:1: parse error on input `type'
> :t Foo.type -- Haha!
Foo.type
:: (Functor f, Profunctor p) =>
p String (f String) -> p Bar (f Bar)
> Bar "hello" ^. Foo.type
"hello"
答案 1 :(得分:6)
我通常只选择附近的字段名称。使用类似_ty
而不是_type
的内容,然后生成的镜头可以调用。
您还可以使用makeLensesWith
提供自定义名称修改功能。