我不知道如何把这个问题写成一个有用的谷歌搜索,所以我希望你们能帮我。我正在使用OCaml Sqlite3库。它具有如下所示的用户定义的数据类型
module Data = struct
type t =
| NONE
| NULL
| INT of int64
| FLOAT of float
| TEXT of string
| BLOB of string我试着在以下网站上学习本教程:
sqlite.html。具体来说,我试图运行这个函数。
let create_tables db =
(* Create two tables in the database. *)
let tables =
[ "people", "pkey INTEGER PRIMARY KEY, first TEXT, last TEXT, age INTEGER" ;
"cars", "pkey INTEGER PRIMARY KEY, make TEXT, model TEXT" ;
]
in
let make_table (name, layout) =
let stmt = Printf.sprintf "CREATE TABLE %s (%s);" name layout in
match Sqlite3.exec db stmt with
| Sqlite3.Rc.OK -> Printf.printf "Table '%s' created.\n" name
| x -> raise (E (Sqlite3.Rc.to_string x))
in
List.iter make_table tables我遇到的问题是当我试图在utop中使用该文件时
Error: This expression has type string * string but an expression was expected of type Data.t * Data.t. Type string is not compatible with type Data.t这是没有意义的,因为字符串应该被强制到Data.t,不是吗?我在这里有什么不懂的?
谢谢!
编辑:看起来解决这个问题的方法是
Data.TEXT "my text query stuff here"不过,这看起来很难看。创建这些显式列表的如下所示
let tables =
[ Data.TEXT "people", Data.TEXT "pkey INTEGER PRIMARY KEY, first TEXT, last TEXT, age INTEGER" ;
Data.TEXT "cars", Data.TEXT "pkey INTEGER PRIMARY KEY, make TEXT, model TEXT" ;
]有什么更习惯的方法来处理这件事吗?
发布于 2015-08-06 21:05:14
您可以定义您自己的从字符串对到data.t对的转换函数:
let todt (a, b) = (Data.TEXT a, Data.TEXT b)然后你可以说
List.map todt tables(使用表的原始定义作为字符串对的列表)。
https://stackoverflow.com/questions/31865308
复制相似问题