Определение экземпляра Eq при исправлении f для функтора f с данными.Функтор.Складной

#haskell

#haskell

Вопрос:

У меня есть следующий функтор:

 import Data.Functor.Foldable

data ExprF a
    = ENum  Integer
    | EBool Bool
    | EVar  Var
    | EOp   Op [a]
    | EIf   a a a
    | ELam  Var a
    | EApp  a a
    | ERec  Var a
    | EZero            
    | ESuc a            
    | ECase a a Var a   
    deriving (Functor)

type Expr = Fix ExprF

  

и я хотел бы иметь Eq экземпляр, определенный для Expr . Однако, если я добавлю Eq в deriving предложение, этого, похоже, будет недостаточно. И если я попытаюсь вручную определить
Eq экземпляр, я получу ошибку перекрытия:

Overlapping instances for Eq Expr
        arising from a use ofGHC.Classes.$dm/=’
      Matching instances:
        instance [safe] Data.Functor.Classes.Eq1 f => Eq (Fix f)
          -- Defined in ‘Data.Functor.Foldable’
  

Кто-нибудь может предложить способ обойти проблему?

Комментарии:

1. Fix ExprF уже есть Eq экземпляр, предоставленный сам по Fix себе. В основном вам не хватает Eq1 экземпляра ExprF , для которого требуется Eq экземпляр Fix ExprF .

2. @chepner Спасибо, я рассмотрю определение экземпляра для Eq1 . Я наивно надеялся, что добавление Eq к deriving предложению будет правильным.

3. Кроме того, имейте в виду, что производный экземпляр, вероятно, будет выполнять только строгое структурное сравнение. Например, он не будет оцениваться Fix (EOp Plus [Fix (ENum 2), Fix (Enum 2)] как равный Fix (ENum 4) . В общем, определение того, равны ли два Expr значения, неразрешимо.

4. @chepner На данном этапе меня интересует только синтаксическое равенство (надеюсь, это разрешимо :), Поэтому реализовано Eq1 так, как вы предложили, все работает нормально. Большое спасибо за вашу помощь!