Haskell的镜头包如何处理也是关键字的字段?

时间:2013-05-17 13:02:46

标签: haskell lenses

镜头如何处理脱糖字段是关键字的情况?我似乎记得读过一些特别的东西,但是我不记得我在哪里阅读它或者“镜头”访问者的名字最终会是什么。

请考虑以下事项:

{-# 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以及关键字到替换的映射。

2 个答案:

答案 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提供自定义名称修改功能。