在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,但%.
的宣言无处可见。
%.
的正确类型是什么?它是从代码的最终版本中删除的吗?如果是这样,是什么取而代之?
答案 0 :(得分:3)
我认为,它在quel_sql.ml
val ( %. ) : ('a -> 'b term) -> string -> 'a -> 'c term
此文件没有对应的.mli和OCaml自己推断出模块的签名。您可以将生成的cmo文件加载到顶层,使用ocamlbrowser或merlin来获取此符号的结构。我做了第一个并在这里复制了signture,因此它没有出现在源代码中(你不会找到它)。