私は、リストを含む2つのオブジェクトの違いを得るために、Haskellの汎用diffライブラリであるgdiff 1.1を使用しようとしています。しかし、私はそれを働かせることができないと私は[FooEnvVar]
のType FooFamily
のインスタンスを定義する方法がわからないためだと思う。gdiffのリストを含むオブジェクトの一般的なdiff
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")]
このコードは-Wall
オプション付きのGHC 8.0.1の下で警告なしでコンパイルします。ここに私はこれまで持っているコードです。私はこのコードを実行すると、私はそれがa
とb
の違いを見せたいだろうが、その代わり、それは、この出力を示しています。場合
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
をそれが重要、私はこれらの拡張子を持つHaskell2010言語使用しています:GADTsを、 LambdaCase、MultiParamTypeClasses、オーバーロードされた文字列、FlexibleInstances。
このエラーを修正するにはどうすればよいですか?