Если вы немного обобщите свой тип, вы можете сделать его функтором:
{-# LANGUAGE DeriveFunctor #-}
data MyType <b>a</b> = Element1 (Maybe <b>a</b>) | Element2 (Maybe <b>a</b>) <b>deriving (Functor, Show)</b>
Тогда вам нужна функция (<$)
из класса типов Functor
.
> i1 = Element1 (Just 1)
> i1
Element1 (Just 1)
> 2 <$ i1
Element1 (Just 2)
Если вы не хотите использовать расширение DeriveFunctor
, экземпляр тривиально определить вручную.
instance Functor MyType where
fmap f (Element1 x) = Element1 (fmap f x)
fmap f (Element2 x) = Element2 (fmap f x)
Специализированная версия (<$)
для Тип monomorphi c может выглядеть как
data MyType = Element1 (Maybe Int) | Element2 (Maybe Int)
change :: Int -> MyType -> MyType
change new (Element1 old) = Element1 (new <$ old)
change new (Element2 old) = Element2 (new <$ old)
Или вы можете определить свой тип как продукт, чтобы обобщить функцию над конструкторами данных.
data MyTypeTags = Element1 | Element2
data MyType = MyType MyTypeTags (Maybe Int)
change :: Int -> MyType -> MyType
change new (MyType tag old) = MyType tag (new <$ old)