GHC 8.0.1では、kind-indexed(?)GADTを使用して奇妙な状況に遭遇しましたが、タイプvs kindシグネチャでforallsを導入すると、行動。タイプインデックス付きGADTで混乱している「種類」
は、次のデータ型を考えてみましょう:
{-# LANGUAGE TypeInType, GADTs, ExplicitForAll #-}
-- Same thing happens when we replace ExplicitForAll with ScopedTypeVariables
import Data.Kind
data F (k :: * -> *) where
data G :: F k -> * where
G :: G x
このデータ型はうまくコンパイルします。ただし、G
のコンストラクタでx
の種類を指定する場合は、型エラーが発生します。我々は(とまたはコンストラクタでforall
せず)種類のシグネチャにforall
を追加した場合
data H :: F k -> * where
H :: forall k' (x :: F k'). H x
エラーメッセージは、エラーがない
• Kind variable ‘k’ is implicitly bound in datatype ‘H’, but does not appear as the kind of any of its type variables. Perhaps you meant to bind it (with TypeInType) explicitly somewhere? • In the data declaration for ‘H’
あります。
data I :: forall k. F k -> * where
I :: I x
data J :: forall k. F k -> * where
J :: forall k' (x :: F k'). J x
何が起こっているのですか?
本当に優れた言葉遣い。 A + – rampion
前者は宣言全体に対して 'F k'を固定しているように見えますが、後者は' H'を別の種類の宣言で使用することができます。私。多次元再帰が可能です。誘導型(Agda/Coqのように)の "parameters vs indices"の区別に似ています。 – chi
これは(最近修正された)コンパイラのバグかもしれません。私はあなたのエラーメッセージを "ghc-8.0.1"と重複させることができますが、 "ghc-8.0.1.20161117"とコンパイルしてください。最新の "stack"がインストールされています。 2)。 –