私の目的のために、ある種の「プロパティ」を持つマップのようなコンテナーが必要です。オブジェクトが異なるプロパティを持つ可能性があります。プロパティにアクセスするために、私はControl.Lensを使用することにしました。これは非常に興味深いものです。しかし、そのようなロジックのレンズのような方法を見つけることができません。プロパティへのアクセス時に、それが存在しない場合は、代わりにデフォルト値を追加し、新しい値を返します。しかし、そこにある場合は、それを使用してください。
つまり、prop_testは True を返す必要があります。
type PropertyMap = Map.Map Int String
data Properties = Properties { _propertyMap :: PropertyMap }
deriving (Eq)
makeLenses ''Properties
emptyProperties = Properties Map.empty
propertyLens pIndex = propertyMap . at pIndex . traverse
property1 = propertyLens 1
property2 = propertyLens 2
property3 = propertyLens 3
obj1Properties :: State Properties ()
obj1Properties = do
property1 .= "Property1 value"
property2 .= "Property2 value"
obj2Properties :: State Properties ()
obj2Properties = do
property1 .= "Property1 value"
property3 .= "Property3 value"
prop_test = op1 /= emptyProperties
where
op1 = execState obj1Properties emptyProperties
しかし今、op1 は emptyProperties と同じです。デフォルト値には、Data.Default を使用できます。どうすればこれを処理できますか? または、おそらく別の方法を使用する必要がありますか?たとえば、プロパティの存在をアンパックしてチェックする State モナドのラッパー関数です。
また、Control.Lens (または別のレンズ パッケージ) の実例へのリンクを教えてください。