2016-03-25 7 views
1

値と型のリストを持つファイルがあります。読み込んだ後、それらをdbに入れる必要があります。そのために、私は適切に入力されたタプルを挿入機能を提供する必要がありますので、私は文字列から型付き値に変換する

が予想と一致しませんでしタイプ 'で失敗している。この

toProperType :: String -> String -> a 
toProperType tp val = 
    case tp of 
    "string" -> val   -- ::String 
    "int" -> toIntType val -- ::Int64 
    "bigint" -> toIntType val -- ::Int64 
    "integer"-> toIntType val  
    "utcdate"-> toDateType val -- :: UTCTime 
    "double" -> toDoubleType val -- :: Double 

のようなものを使用して値を変換しようとしています実際のタイプが「Double」の「a」は、

と結びついたリジッドタイプの変数です。

この機能を実現するには、どのような方法が適していますか?

は、たぶん私はいくつかの拡張機能を必要とするか、THで別々の機能を生成

+2

コンパイラはあなたの関数が実際には* generic *であると伝えます - それはどの型も返すことができると主張しますが、あなたのケースは非常に特定の型を返すのでコンパイラは文句を言います。最初のステップは、結果が共通して持つべきものを見つけようとすることです。ここでは、それらを何らかのデータベースに入れたいと思っています(あなたは何も書きませんでした)。最初の試みは、 'makePersistance :: String - > String - >(DbContext - > IO())' – Carsten

+1

btw:db-contextを指定する関数は、* SQL *を返すだけで十分でしょう。 (SQL-DBのようなものだと仮定して)あなたのデータベースに 'INSERT'する必要があります。' String - > String - > String'でもかまいません。 " - >" INSERT INTOテーブルVALUES( '"++ val ++"') "'(もちろん、私はあなたに、SQL注入attacのドアを開くので、これが本当に危険かもしれないと言わなければならないと感じています) – Carsten

+0

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) 'と型の組み合わせが異なる可能性があります。私はこのタプルを手作業で書かなければなりません –

答えて

2

ここでの問題は、あなたの関数型で-> 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値のケースで呼び出し、返された型に基づいて何をすべきかを決定します。

関連する問題