Ich versuche zu verwenden gdiff 1.1, eine generische diff-Bibliothek für Haskell, um einen Unterschied zwischen zwei Objekten zu erhalten, die zufällig eine Liste enthalten. Ich bin jedoch nicht in der Lage, es zur Arbeit zu bringen, und ich denke, es ist, weil ich nicht weiß, wie man die Instanz Type FooFamily
für [FooEnvVar]
definiert. Hier ist der Code, den ich bisher habe:Generische Diff von Objekten, die Listen mit Gdiff enthalten
module Main where
import Data.Generic.Diff
data Foo = Foo { fooEnv :: [FooEnvVar] }
deriving (Show, Eq)
data FooStr = FooStr String
deriving (Show, Eq, Ord)
data FooEnvVar = FooEnvVar { fooEnvName :: FooStr }
deriving (Show, Eq, Ord)
data FooFamily :: * -> * -> * where
FooF :: FooFamily Foo (Cons [FooEnvVar] Nil)
FooStrF :: FooFamily FooStr (Cons String Nil)
instance Family FooFamily where
decEq FooF FooF = Just (Refl, Refl)
decEq FooStrF FooStrF = Just (Refl, Refl)
decEq _ _ = Nothing
fields FooF (Foo fe) = Just (CCons fe CNil)
fields FooStrF (FooStr str) = Just (CCons str CNil)
apply FooF (CCons fe CNil) = Foo fe
apply FooStrF (CCons str CNil) = FooStr str
string FooF = "FooF"
string FooStrF = "FooStrF"
instance Type FooFamily Foo where
constructors = [Concr FooF]
instance Type FooFamily [FooEnvVar] where
constructors = [] -- what should I put here?
main :: IO()
main =
putStrLn $ show ((diff a b) :: EditScript FooFamily Foo Foo)
where
a = Foo [FooEnvVar (FooStr "hello"), FooEnvVar (FooStr "world")]
b = Foo [FooEnvVar (FooStr "hi"), FooEnvVar (FooStr "world")]
Dieser Code kompiliert ohne Warnungen unter GHC 8.0.1 mit der -Wall
Option. Wenn ich diesen Code ausführen, würde ich will, dass es die Unterschiede zwischen a
und b
, um zu zeigen, sondern es zeigt diese Ausgabe:
test_gdiff: Incorrect Family or Type instance.
CallStack (from HasCallStack):
error, called at src/Data/Generic/Diff.hs:313:22 in gdiff-1.1-KTbM5AUQcBxD5ewDUGZ4O3:Data.Generic.Diff
Falls es wichtig ist, ich mit diesen Erweiterungen der Haskell2010 Sprache verwenden: GADTs, LambdaCase, MultiParamTypeClasses, OverloadedStrings, FlexibleInstances.
Wie kann ich diesen Fehler beheben?