DataKinds によってプロモートされたペアによって、2 つの型を取る型コンストラクタ f があるとします。
forall (f :: (ka, kb) -> *)
次に、数量詞のforward
ような関数を実装できます。curry
forall
forward :: forall (f :: (ka, kb) -> *).
(forall (ab :: (ka, kb)). f ab) ->
(forall (a :: ka) (b :: kb). f '(a, b))
forward x = x
ただし、逆関数には問題があります。
backward :: forall (f :: (*, *) -> *).
(forall (a :: *) (b :: *). f '(a, b)) ->
(forall (ab :: (*, *)). f ab)
backward x = x
GHC 8.0.1 では次のエラー メッセージが表示されます。
• タイプ「ab」を「(a0, b0)」と一致させることができませんでした 'ab' は、によってバインドされた固定型変数です。 次の型シグネチャ: 後方 :: forall (ab :: (*, *))。(forall a b. f '(a, b)) -> f ab 6時116分 予想されるタイプ: f ab 実際の型: f '(a0, b0) • 式: x 「後方」の式: 後方 x = x
概念的には、有効なプログラムのようです。この機能を実装する別の方法はありますか? それとも、これはGHCの既知の制限ですか?