Я часто сталкиваюсь с этой ситуацией, так как это раздражает.Как избежать написания этого типа шаблона Haskell
Скажем, у меня есть тип суммы, которая может содержать экземпляр 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
в правой части уравнения.
Есть ли способ, которым я могу избежать написания этого шаблона для других конструкторов?
Вы можете написать сообщение об ошибке? – AJFarmar
Это всего лишь пример, и фактический код намного сложнее, поэтому я не имею точного сообщения об ошибке. Но легко увидеть ошибку - Тип fmap должен быть '(a -> b) -> Foo a -> Foo b' Но последнее уравнение имеет' fmap fa = a', где 'f: :(a-> b) 'и' a :: Foo a', подразумевая, что тип fmap является '(a-> b) -> Foo a -> Foo a'. Поэтому в сообщении об ошибке говорится, что 'a' и' b' не могут быть унифицированы. –
@AJFarmar rhs имеет другой тип, чем lhs. GHC знает, что типы проверяются, только если мы выписываем конструкторы. –