首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不相容类型与原语类型

不相容类型与原语类型
EN

Stack Overflow用户
提问于 2015-08-06 20:36:17
回答 1查看 109关注 0票数 1

我不知道如何把这个问题写成一个有用的谷歌搜索,所以我希望你们能帮我。我正在使用OCaml Sqlite3库。它具有如下所示的用户定义的数据类型

代码语言:javascript
复制
module Data = struct
  type t =
    | NONE
    | NULL
    | INT of int64
    | FLOAT of float
    | TEXT of string
    | BLOB of string

我试着在以下网站上学习本教程:

sqlite.html。具体来说,我试图运行这个函数。

代码语言:javascript
复制
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中使用该文件时

代码语言:javascript
复制
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,不是吗?我在这里有什么不懂的?

谢谢!

编辑:看起来解决这个问题的方法是

代码语言:javascript
复制
Data.TEXT "my text query stuff here"

不过,这看起来很难看。创建这些显式列表的如下所示

代码语言:javascript
复制
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" ;
      ]

有什么更习惯的方法来处理这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-06 21:05:14

您可以定义您自己的从字符串对到data.t对的转换函数:

代码语言:javascript
复制
let todt (a, b) = (Data.TEXT a, Data.TEXT b)

然后你可以说

代码语言:javascript
复制
List.map todt tables

(使用表的原始定义作为字符串对的列表)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31865308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档