LensのPrismの使い方について質問です
Prismを
set
や
over
で
ASetter
として使えることは分かったのですが、Prismの中身に
Lens
を使用してアクセスしたいと思った時にやり方がわかりません。(例を下に載せます)
現在は↓の
makeBelongTo
のようにしているものの、Characterの値コンストラクタが変わったら変更しなくてはいけなくなり、じゃあPrismにしたメリットないのでは、と悩んでいます。
data Character = Animal {
_name :: String
, _age :: Int
, _memberOf :: Maybe String
}
| Object {
_name :: String
, _memberOf :: Maybe String
}
deriving (Show)
makePrisms ''Character
makeLenses ''Character
-- この関数を
makeBelengTo :: String -> Character -> Character
makeBelengTo belongTo c@(Animal n a _) = Animal n a (Just belongTo)
makeBelengTo belongTo c@(Object n _) = Object n (Just belongTo)
-- こんな感じにしたい(これだと動かない)
makeBelongToWithLens :: String -> Character -> Character
makeBelongToWithLens belongTo = set (_Animal.memberOf) (Just belongTo)
. set (_Object.memberOf) (Just belongTo)
また、
set (_Animal._3) (Just belongTo)
のような解法は見つけたのですが、結局タプルの位置を指定しているためこれならPrismのメリットがないな…と思っています。