10

脱糖フィールドがキーワードである場合、lens はどのように処理しますか? 何か特別なことが行われたことを読んだことを覚えているようですが、どこで読んだのか、「lensed」アクセサーの名前が何になるのか思い出せません。

次の点を考慮してください。

{-# 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ですか?

ここでは適切な開発環境にアクセスできないため、これを学校の haskell にぶつけなければなりませんでしたが、他の人にとっては役立つかもしれないと思います。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 に答える