为什么将OCaml类型转换函数命名为;“A”或“B”中的“U”;?

为什么将OCaml类型转换函数命名为;“A”或“B”中的“U”;?,ocaml,naming,Ocaml,Naming,像“A_of_B”这样的名称在OCaml中是一种独特的命名约定,但我想知道为什么。这是因为法语和英语的语言用法不同吗?还是Xavier Leroy的个人偏好 背景:我发现OCaml的类型转换函数的名称类似于Stdlib模块中的A\u of_B,例如,int\u of_string:string->int或float\u of_int:int->float。其他流行语言使用的名称如AtoB,例如,C中的itoa函数。我的猜测是,当使用函数作为值时,它的可读性更高,例如使用高阶函数,如函数组合: #

像“A_of_B”这样的名称在OCaml中是一种独特的命名约定,但我想知道为什么。这是因为法语和英语的语言用法不同吗?还是Xavier Leroy的个人偏好


背景:我发现OCaml的类型转换函数的名称类似于Stdlib模块中的
A\u of_B
,例如,
int\u of_string:string->int
float\u of_int:int->float
。其他流行语言使用的名称如
AtoB
,例如,C中的
itoa
函数。

我的猜测是,当使用函数作为值时,它的可读性更高,例如使用高阶函数,如函数组合:

# let compose f g = fun x -> f (g x);;
val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>

首先,让我们从一个简短的开场白开始。泽维尔·勒罗伊(Xavier Leroy)没有发明这种语言,而且这种语言也不是在法国诞生的。OAML是由(可计算函数逻辑)定理证明器的元语言(ML)产生的,它是由斯坦福大学和爱丁堡大学开发的。下面是从原始LCF 1977中获得的代码片段

   let gensrinfo th =
     let srthm = disjsrvars th in 
     let hypfrees = formlfrees(hyp srthm)
     and hyptyvars = formltyvars(hyp srthm)
     and (),p,() = destimpequiv(concl srthm) in 
     srthm , termmatch(hypfrees,hyptyvars) p;;
它像什么东西吗?;)法国Formel团队在分类抽象机的基础上开发了一种新的ML实现,这一实现后来演变成了SML,而Caml本身的诞生比上面1987年的代码片段晚了10年。三年后的1990年,Xavier Leroy设计了一个全新的Caml实现,它基于一个名为ZINK的字节码解释器。五年后,他们开发了一个优化编译器,五年后的2000年,Objective Caml诞生了,又名O'Caml,现在是OCaml

总之,ML最初是由英语社区设计和开发的,没有理由用法语或Xavier的偏好来搜索约定词源。事实上,我们可以在LCF(例如,
intoftok
tokofint
操作符)和LCF的其他衍生工具(例如HOL)中找到这种约定,例如,HOL 1988标准库已经有了这个函数,当时Xavier甚至还没有毕业


那么,为什么要这样做?它来自于程序的推理方式,这是逻辑的而不是命令式的(记住,ML是作为一种元语言(逻辑语言)在定理证明器中诞生的)。我们考虑的不是函数是如何实现的,而是这个术语代表什么,那么字符串“42”的int是什么?它是一个整数,具有文本表示“42”。我们不会将“42”转换成一个整数,并将其视为一个转换框,相反,我们使用数学中的思维方式,例如,
cos0.0
不会将
0.0
转换为
1.0
cos0.0
1.0
。这种思维方式有助于——一种思考程序和理解其语义的强大方式

此问题属于english.stackexchange或french.stackexchange。我所知道的最接近的结构是拉丁语中的“物质之源”(“蜂蜜之河”,“大理石雕像”)。我认为这也与哪个模块有定义有关,例如,在整数模块中,你会有
int\u of_string
int\u to_string
。如果这些函数是在一个字符串模块中定义的,那么您将拥有
string\u of int
string\u to\u int
。对于不普遍的东西,它是Foo.of\u Bar和Foo.to\u Bar。但是核心类型没有自己的模块,因此模块范围被类型替换。
compose int_to_string float_to_int
   let gensrinfo th =
     let srthm = disjsrvars th in 
     let hypfrees = formlfrees(hyp srthm)
     and hyptyvars = formltyvars(hyp srthm)
     and (),p,() = destimpequiv(concl srthm) in 
     srthm , termmatch(hypfrees,hyptyvars) p;;