#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 of ‘GHC.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
так, как вы предложили, все работает нормально. Большое спасибо за вашу помощь!