为什么OCaml类型转换函数以“ A_of_B”的形式命名?

“ A_of_B”之类的名称是OCaml中的唯一命名约定,但我想知道为什么。是法语和英语使用不同语言的结果吗?还是Xavier Leroy的个人喜好?

背景:我发现OCaml的类型转换函数在Stdlib模块中具有类似A_of_B的名称,例如int_of_string : string -> intfloat_of_int : int -> float。其他流行语言使用的名称类似AtoB,例如C语言中的itoa函数。

love2016 回答:为什么OCaml类型转换函数以“ A_of_B”的形式命名?

首先,让我们从简短的介绍开始,到history of OCaml。 Xavier Leroy并不是该语言的发明者,而且该语言也不是法国出生的。 OCaml源自LCF在斯坦福大学和爱丁堡大学开发的Robin Milner(可计算函数逻辑)定理证明者的元语言(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的出生时间比ML早了10年。上面的代码段是在1987年。三年后的1990年,Xavier Leroy基于名为ZINC的字节码解释器设计了Caml的全新实现。五年后,他们开发了一个优化的编译器,再过了五年,在2000年,Objective Caml诞生了,又名O'Caml,现在是OCaml。

这就是说,ML最初是由英语社区设计和开发的,没有理由寻找法语的常规词源或Xavier的偏爱。实际上,我们确实已经在LCF(例如intoftoktokofint运算符)和LCF的其他派生词(例如HOL)中找到了该约定,例如HOL 1988标准库已经具有功能{ {3}},当时Xavier尚未毕业。

那么,为什么要使用这个约定?它来自于程序推理的方式,这是逻辑而不是命令性的(请记住,ML在定理证明者中是作为元语言(逻辑语言)而诞生的)。我们没有考虑功能的实现方法,而是考虑该术语表示的含义,因此int_of_string "42"是什么?它是一个整数,文本表示为“ 42”。我们不会将“ 42”转换为整数,而是将其视为转换框,而是像数学中那样使用int_of_string思维,例如cos 0.0不会将0.0转换为1.0cos 0.0 1.0。这种思维方式有助于declarative -一种思考程序和理解其语义的有效方法。

,

我的猜测是,当使用函数作为值(例如具有更高阶的函数,例如函数组成:

java.lang.ClassNotFoundException: com.ibm.db2.jcc.DB2Driver
java.lang.ClassNotFoundException: com.ibm.db2.jcc.DB2Driver
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.vat.ui.RexConnection.startMyRexConnection(RexConnection.java:26)
    at org.apache.jsp.loginRequestHandler_jsp._jspService(loginRequestHandler_jsp.java:143)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

这里,成分直接反映在名称中:

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

以相反的顺序读取具有函数名称的等效项可能有些困难:

# let string_of_float = compose string_of_int int_of_float;;
val string_of_float : float -> string = <fun>
本文链接:https://www.f2er.com/2780502.html

大家都在问