Я часто сталкиваюсь с этой ситуацией, потому что это раздражает.
Скажем, у меня есть тип суммы, который может содержать экземпляр x
или множество других вещей, не связанных с x
-
data Foo x = X x | Y Int | Z String | ...(other constructors not involving x)
Чтобы объявить экземпляр Functor, я должен это сделать -
instance Functor Foo where
fmap f (X x) = X (f x)
fmap _ (Y y) = Y y
fmap _ (Z z) = Z z
... And so on
В то время как то, что я хотел бы сделать, это -
instance Functor Foo where
fmap f (X x) = X (f x)
fmap _ a = a
то есть. Я только забочусь о конструкторе x
, все остальные конструкторы просто "пройдены". Но, конечно, это не скомпилировалось, потому что a
с левой стороны - это другой тип от a
в правой части уравнения.
Есть ли способ избежать написания этого шаблона для других конструкторов?