ここでの問題は、あなたの関数型で-> a
の意味である(しかし、それらをディスパッチする方法がわかりません)。実際にこのタイプの関数がある場合は、という名前の関数をという名前の関数で選択した具体的な型を指定できるようにする必要があります。タイプ
String -> String -> MyCustomType
ただし、これはあなたが気にしていたことではありません。あなたは「すべてのタイプのために」という意味ではありません。「2つの文字列について、値があるタイプはa
です。この考え方は、呼び出し側ではなく型変数を選択することを「存在量の定量化」と呼び、GHCはそれをサポートしています。しかし、私は本当にそれがあなたがしたいことだとは思わない。結局のところ、実際にこの機能を使用する場合は、UTCTime
またはDouble
などが返ってきたかどうかを判断することができます。その上
data Dyn = String String | Int Int | BigInt Integer | UTCDate UTCTime ...
と:あなたが(ちょうどあなたがpolymoprhic関数で型変数のケースができないかのように)存在量化でこれを行うことはできませんので、我々は代わりにカスタムデータ型を作成する必要があります。それは、これは深刻なHaskellライブラリは、あなたが良いにしているJSONの解析のようなものを扱うか、どのような方法ではありませんあなたはあなたのタイプを返すことがあり、それぞれの場合について明示的なコンストラクタをリストアップして、あなたの関数が
toProperType :: String -> String -> Dyn
toProperType tp val =
case tp of
"string" -> String val -- ::String
"int" -> Int $ toIntType val -- ::Int64
"bigint" -> BigInt $ toIntType val -- ::Int64
"integer"-> Integer $ toIntType val
"utcdate"-> UTCDate $ toDateType val -- :: UTCTime
"double" -> Double $ toDoubleType val -- :: Double
を読み込みます、です会社。今すぐそれは型付きであり、誰でもこの関数を単にDyn
値のケースで呼び出し、返された型に基づいて何をすべきかを決定します。
コンパイラはあなたの関数が実際には* generic *であると伝えます - それはどの型も返すことができると主張しますが、あなたのケースは非常に特定の型を返すのでコンパイラは文句を言います。最初のステップは、結果が共通して持つべきものを見つけようとすることです。ここでは、それらを何らかのデータベースに入れたいと思っています(あなたは何も書きませんでした)。最初の試みは、 'makePersistance :: String - > String - >(DbContext - > IO())' – Carsten
btw:db-contextを指定する関数は、* SQL *を返すだけで十分でしょう。 (SQL-DBのようなものだと仮定して)あなたのデータベースに 'INSERT'する必要があります。' String - > String - > String'でもかまいません。 " - >" INSERT INTOテーブルVALUES( '"++ val ++"') "'(もちろん、私はあなたに、SQL注入attacのドアを開くので、これが本当に危険かもしれないと言わなければならないと感じています) – Carsten
I PostgreSQLを持っていて、 'res ::(Any SomeException [Only Int])< - $ query conn query '(a1 :: String、a2 :: String、i3 :: Int64、 a4 ::文字列、a5 ::文字列、a6 ::文字列、i7 :: Int64、a8 ::文字列、a9 ::文字列、a10 ::文字列、a11 ::文字列、a12 ::文字列、a13 ::文字列、 t14 :: UTCTime、a15 :: String) 'と型の組み合わせが異なる可能性があります。私はこのタプルを手作業で書かなければなりません –