次のコードは、「C1」をコンパイルしタイプファミリーをjsonに格納した後でそれを検証する方法は?
の誤差は「C」とタイプ「C1」を 一致しませんでし与えないであろうコンストラクタと パターンによって結合剛性型変数であり: SomeReq :: forall c。コネティカットC =>必須のC - > SomeReq、 式の「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()
ためexistentialsの理由は、私は、JSONでこれらのデータ型を格納する必要があるということです。 (Auth c)
と(Req c)
は常に別々に格納されますが、常に一緒に使用されます。
この作業を行う唯一の方法は、これらのタイプが一致するかどうかを検証するために何らかのランタイムチェックを行うことです。私はそれをどうやって行うのか分からない。
あなたのJSONストレージは 'c 'が何であるかを判断していますか?あるいは 'c'はコードの静的構造によって決まりますか? –
'c'はリクエストを実行できるサービスです。例えばS3、またはGoogle – whitehead1415