10

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

考虑以下:

{-# 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根据爱德华的建议,我将使用关键字到替换的映射。

4

2 回答 2

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"
于 2013-05-17T15:16:00.413 回答
6

我通常只选择一个附近的字段名称。使用类似的东西_ty代替,_type然后生成的镜头将是可调用的。

您还可以使用makeLensesWith来提供自定义名称修饰功能。

于 2013-05-17T15:01:02.930 回答