X = A | B и data Gadt (p :: X) where GA :: Gadt A, GB :: Gadt B, а я хочу штуку вида f :: SomeConstraint p => Gadt p, чтобы f @A,f @B бы работали, это можно без unsafe coerce делать нормально? Понятно, что можно таскать там что то вроде Either (Refl a A) (Refl a B), но такое неудобно использовать для более больших X
Да и так должно вроде работать
f @A =... нельзя же писать, и например class KnownX (p :: X) where knownX :: X не поможет компилятору по терму понять что у нас он их нужного типа пришёл (только с unsafeCoerce ему помочь можно)
не очень понял где ты тут хочешь unsafeCoerce, но делается это просто {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE TypeApplications #-} data X = A | B data Gadt (p :: X) where GA :: Gadt A; GB :: Gadt B class MkGadt p where mkGadt :: Gadt p instance MkGadt A where mkGadt = GA instance MkGadt B where mkGadt = GB f :: MkGadt p => Gadt p f = mkGadt x = f @A y = f @B
Я хочу чтобы mkGadt было одной функцией
import Data.Proxy?
f (Proxy :: Proxy A) = ... f (Proxy :: Proxy B) = ... не работает, конечно
А вот это я решил через тайплевельный список пар [(Symbol,k)] пока что
Обсуждают сегодня