GADTとDataKindsを使用して発生している問題の非常に単純な例を作成しました。私の実際のアプリケーションは明らかにより複雑ですが、これは私の状況の本質を明確に捉えています。Test型の任意の値(T1、T2)を返すことができる関数を作成しようとしています。これを達成する方法はありますか、それとも依存型の領域に入りますか?ここでの質問は似ているように見えますが、私はそれらから私の質問に対する答えを見つけることができませんでした(または理解できませんでした)。私はこれらのGHC拡張機能を理解し始めたばかりです。ありがとう。
{-# LANGUAGE GADTs, DataKinds, FlexibleInstances, KindSignatures #-}
module Test where
data TIdx = TI | TD
data Test :: TIdx -> * where
T1 :: Int -> Test TI
T2 :: Double -> Test TD
type T1 = Test TI
type T2 = Test TD
prob :: T1 -> T2 -> Test TIdx
prob x y = undefined
----ここにエラーがあります----Test.hs:14:26:
Kind mis-match
The first argument of `Test' should have kind `TIdx',
but `TIdx' has kind `*'
In the type signature for `prob': prob :: T1 -> T2 -> Test TIdx