【问题标题】:What is the type of QueΛ's projection operator?QueΛ的投影算子是什么类型的?
【发布时间】:2016-05-14 08:32:53
【问题描述】:

在 Suzuki、Kiselyov 和 Kameyama 最近的论文 Finally, Safely-Extensible and Efficient Language-Integrated Query 中,他们给出了嵌入 OCaml 中的类型安全、可扩展的查询语言的规范,该语言可以翻译成 SQL。

这是他们用于查询的代数,摘自论文。

module type Symantics = sig
    type α repr (* representation type *)

    val int: int → int repr
    val bool: bool → bool repr
    val string: string → string repr

    val lam: (α repr → β repr) → (α→β) repr
    val app: (α → β) repr → α repr → β repr

    val foreach: (unit→ α list repr) →
                 (α repr → β list repr) →
                 β list repr
    val where: bool repr → (unit → α list repr) → α list repr
    val yield: α repr → α list repr
    val nil: unit → α list repr
    val (@%): α list repr → α list repr → α list repr (* bag union *)

    val (=%): α repr → α repr → bool repr

    ... (* abbreviated *)

    type α obs (* observation *)
    val observe: (unit → α repr) → α obs
end

投影运算符(%.),在论文后面使用,在标记为缩写的部分中被截断。正文说:

我们使用符号 @% 表示 [bag union],=% 表示相等测试,%. 表示 投影,为简洁起见省略了其类型。查看我们的代码以获取更多信息 详情。

尽职尽责地看了the code,但是%.的声明却不见了。

%. 的正确类型是什么?它是否从代码的最终版本中删除?如果是,是什么取代了它?

【问题讨论】:

    标签: types functional-programming operators ocaml


    【解决方案1】:

    我想,在quel_sql.ml

    val ( %. ) : ('a -> 'b term) -> string -> 'a -> 'c term
    

    这个文件没有对应的 .mli 并且 OCaml 自己推导出模块的签名。您可以将生成的 cmo 文件加载到顶层,使用 ocamlbrowser 或 merlin 来获取此符号的签名。我做了第一个并在这里复制粘贴了签名,所以它不会出现在源代码中(你不会找到它)。

    【讨论】:

    • 我不认为是那个。它是一个实现,而不是一个声明,它与term 相关联
    • @BenjaminHodgson,你不需要在 OCaml 中声明值,因为语言总是可以推断类型。所以有时人们不会编写mli 文件,而是允许编译器自行推断它们。所以没有明确的声明。
    • ivg 我正在寻找signature - 客户端将使用的接口,而不是 SQL 方面的实现。
    • 正如ivg所说,如果省略了mli文件,OCaml会自己生成签名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2020-11-22
    • 2018-10-07
    • 2014-06-08
    • 2010-11-05
    相关资源
    最近更新 更多