Der folgende Code nicht kompiliert werden und gibt den FehlerWie validiere ich die type family nach dem Speichern in json?
kann mit ‚c‘ Typ ‚c1‘ entspricht ‚c1‘ nicht eine starre Variable vom Typ von ein Muster mit Konstruktor gebunden: SomeReq :: forall c. Conn c => Req c -> SomeReq, in einer Gleichung für ‚run‘
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ExistentialQuantification #-}
module Main where
import qualified Data.Text as T
class Conn c where
data Auth c :: *
data Env c :: *
data Req c :: *
getEnv :: Auth c -> IO (Env c)
runReq :: Env c -> Req c -> IO String
data SomeAuth = forall c. (Conn c) => SomeAuth (Auth c)
data SomeReq = forall c. (Conn c) => SomeReq (Auth c)
run :: SomeAuth -> SomeReq -> IO String
run (SomeAuth auth) (SomeReq req) = do
env <- getEnv auth
runReq env req
main :: IO()
main = return()
Der Grund für die Existenziale ist, dass ich diese Datentypen in json speichern müssen. (Auth c)
und (Req c)
werden immer separat gespeichert, aber immer zusammen verwendet.
Ich gehe davon aus, dass der einzige mögliche Weg, dies zu machen, eine Art Laufzeitprüfung ist, um zu überprüfen, ob diese Typen übereinstimmen. Ich bin mir nicht sicher, wie ich das machen soll.
Sie sagen, dass Ihr JSON-Speicher bestimmt, was "c" ist? Oder wird "c" durch die statische Struktur des Codes bestimmt? –
'c' ist ein Service, auf dem wir die Anfrage ausführen können. Zum Beispiel S3 oder Google – whitehead1415