以下のコードでは、関数f
のアイデアは妥当であると確信しています。最初の要素の型がわからないのはD
ですが、T a
いくつかはa
です。複数のコンストラクタから最も一般的な型を抽出する
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
data T a
data D where
D1 :: T a -> D
D2 :: T Bool -> D
f :: D -> (forall a. T a)
f (D1 x) = x
f (D2 x) = x
main = return()
ただし、GHCは、次のエラーがスローされます。
GADTTypes.hs:11:12: error:
• Couldn't match type ‘a1’ with ‘a’
‘a1’ is a rigid type variable bound by
a pattern with constructor: D1 :: forall a. T a -> D,
in an equation for ‘f’
at GADTTypes.hs:11:4
‘a’ is a rigid type variable bound by
the type signature for:
f :: forall a. D -> T a
at GADTTypes.hs:11:1
Expected type: T a
Actual type: T a1
• In the expression: x
In an equation for ‘f’: f (D1 x) = x
• Relevant bindings include x :: T a1 (bound at GADTTypes.hs:11:7)
GADTTypes.hs:12:12: error:
• Couldn't match type ‘a’ with ‘Bool’
‘a’ is a rigid type variable bound by
the type signature for:
f :: forall a. D -> T a
at GADTTypes.hs:11:1
Expected type: T a
Actual type: T Bool
• In the expression: x
In an equation for ‘f’: f (D2 x) = x
ただ、私が達成しようとしていることは可能であるかどうかを疑問に、どのように自分のコードを修正するには?
私は関数 'g :: T a - > ...'を持っていれば、 'f'を定義して' g(f x) 'をコンパイルすることができますか? – Clinton
@Clintonその正確な構文ではありません。それには 'f :: ... - >が必要です。 T a 'はHaskellには存在しない。 – chi