Я создал очень простой пример проблемы, с которой я пользуюсь GADT и DataKinds. Мое реальное применение явно сложнее, но это ясно отражает суть моей ситуации. Я пытаюсь создать функцию, которая может возвращать любые значения (T1, T2) типа Test. Есть ли способ достичь этого или я попадаю в область зависимых типов? Вопросы здесь кажутся похожими, но я не мог найти (или постигнуть) ответ на мой вопрос от них. Я только начинаю понимать эти расширения GHC. Благодарю.Проблема с DataKinds
{-# 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
Какова должна быть семантика 'prob'? Что делать? –
Я добавил сообщение об ошибке GHCI. Это надуманный пример. Я хочу иметь возможность возвратить любые значения Test (Test TI или Test TD) на основе некоторых вычислений. – MFlamer
Я попытался угадать, что вам нужно, но лучше описать, чего именно вы хотите достичь. Продуманные примеры одобрены, как только ваше намерение станет ясным. –