2016-11-06 9 views
2

私は次のカスタムデータ型を持っている:カスタムデータ型とGADTの混乱?

data FirstPair' a b = FirstPair a b deriving (Show, Ord, Eq) 
type FirstPair a = FirstPair' a a 

data SecondPair' a b = SecondPair a b deriving (Show, Ord, Eq) 
type SecondPair a = SecondPair' a a 

私は私の機能のためにGADT構造を作成しようとしています:

data Generator a where 
    Success :: FirstPair a -> Generator (SecondPair a) 
    Fail :: FirstPair a -> Generator Bool 

myFunction :: Generator a -> a 
myFunction (Success fp) = SecondPair "21" "24" 
myFunction (Fail fp) = False 

「ジェネレーター」タイプの役割が力に私を有効にすることです'Success'が渡された場合は 'myPunction'のインスタンスを返し、 'Fail'が渡された場合は 'False'を返します。

しかし、私はこのエラーを取得しています:

"Could not deduce: a1 ~ [Char] from the context: a ~ SecondPair' a1 a1 bound by a pattern with constructor: Success :: forall a. FirstPair a -> Generator (SecondPair a)" 

私はここで間違って何をしているのですか?

+0

あなたの質問にいくつかのコードがないようです。あなたのエラーは 'ContextaPair''を参照していますが、あなたはそれを言及していません。実際のコードを投稿できますか? – crockeea

+1

投稿したのと同じコードをまだ実行していません。あなたのコードには[Char]の値はありません。 – chepner

答えて

4

ここに問題があります。型シグネチャは、私がmyFunctionGenerator aを与える場合は、関係なく、私が選ぶどのようなタイプa、ではありません

myFunction :: forall a. Generator a -> a 

の省略形です、それはaを私に戻って得られます。だから私がGenerator Intを与えたら、それは私にIntを返すはずです。

だから私はしかし、道myFunctionが定義されている、それは常に与える

successval :: Generator (SecondPair Int) 
successval = Success (FirstPair 42 42 :: FirstPair Int) 

を構築し、その後、myFunctionに渡し、および型シグネチャに基づいて、私は

myFunction successVal :: SecondPair Int 

を取得する必要がありますすることができます私がそれを渡すタイプにかかわらずSecondPair Stringを返せば、それはそれが不平を言っている問題です。

この種の多態性が必要な場合は、何らかの引数を使用する必要があります。例えば。 xyに来て(とFirstPairSecondPairがGADTは、彼らが必要と言う方法が一致)として外出xyが同じ型であるため、

myFunction (Success (FirstPair x y)) = SecondPair x y 

は、トリックを行うだろう。

あなたがFailの場合には正しく機能していない

myFunction :: Generator a -> SecondPair String 

(のようなものにする必要が、関係なく、その後myFunctionの型シグネチャのどちらかが間違っている何SecondPair Stringを返さないために必要がある場合 - - あなたが実際に行きたいルートであるかどうかについてもっと言いたいことがありますが、暗い推測のために書くよりも少し複雑です)

またはGADTはそれを言う必要があります結果はSecondPair Stringになります。

data Generator a where 
    Success :: FirstPair a -> Generator (SecondPair String) 
    ... 

私はこれらのシナリオはひどくはないと思っていますが、問題の理解に役立つと思いました。