由于项目需要,需要研究OCaml语言,一时无从小时,自网上拜读几位前辈的心得后,有一些了解。现在总结如下:

       OCaml是一种函数式编程语言,是一种面向对象的ML语言。不同于结构性语言。其函数可以当作具体的值来使用;使用变量时,无需定义变量的类型,编译器可以自动推测出变量的语言类型;但此语言的类型经过定义后就无法改变。

       常见操作
       1、let绑定,函数、变量定义 let x=2;let add  x y=x+y;

      # let add x y = x+y;;

      val add : int -> int -> int = <fun>

      # add 12 13;;

      - : int = 25

       标准短语

let name = expression in

可以用于定义一个局部表达式,然后

name

就可以在后面的函数中使用,来替代

expression

了,直到结束该代码块的

;;

出现。

注意在in后面我们并没有缩进。就把let...in当作是一个语句。let in在函数内使用时可以表示对局部变量赋值。

       2、if match,判断语句

      # let pd n = if n=2 then true else false;;
      val pd : int -> bool = <fun>
      # pd 3;;
      - : bool = false
      # pd 2;;
      - : bool = true
     # pd 4;;
     - : bool = false

    # let mat n= match n*20 with 20->true | _->false;;
    val mat : int -> bool = <fun>
    # mat 1;;
    - : bool = true
   # mat 2;;
   - : bool = false

   3、float_of_int,int_of_float;两个类型转换函数,在进行数据操作时可以使用。

   4、链,这是ML语言中的一个基本数据结构,[]这里面保存list数据结构,结构之间通过::连接起来,比如[1:2:3]::[4:5];采用标准库函数list.map可以方便的调用函数处理链中的每个元素。如
     # let sum x = x*x;;

     val sum : int -> int = <fun>

     # let w=[2;3;4;5;6];;

    val w : int list = [2; 3; 4; 5; 6]

    # List.map sum w;;

     - : int list = [4; 9; 16; 25; 36]

        tuple(元组),用()表示,可以保存任意的数据结构。(2,2.45,func x->x*x);

       record表有名字的数据组合;{a:int,b:string};类似于c语言中的struct结构。

      type 可以自定义各种数据结构。

    5、ref,引用,OCaml语言是一个常量语言,这就意味着常量一旦赋值,其值不可改变。如果你想在程序中利用一个值,并且对其进行操作,可以使用这一个操作符。:=是对应用赋值,!=是显示当前引用的值。

# let ex_rf= ref 56;;     //生成一个引用ex_rf
val ex_rf : int ref = {contents = 56}
# ex_rf:=59;;               //对引用赋值59
- : unit = ()
# !ex_rf;;                     //显示引用的当前值
- : int = 59   

下面这个例子是对字符串进行的操作。

# let e_rf=ref "nankai";;
val e_rf : string ref = {contents = "nankai"}
# !e_rf;;
- : string = "nankai"
# e_rf:="wengchen";;
- : unit = ()
# !e_rf;;
- : string = "wengchen"

也可以通过<-对引用进行赋值

# !e_rf;;
- : string = "wengchen"
# e_rf.contents<-"wjf";;
- : unit = ()
# !e_rf;;
- : string = "wjf"

6、函数,在Ocaml中函数相关的关键字有两个 function、fun,其中function关键字定义的函数只能有一个参数,而fun关键字定义的函数可以有多个参数。

# let c n = fun x y ->n+1;;
val c : int -> 'a -> 'b -> int = <fun>
# c 3;;
- : '_a -> '_b -> int = <fun>
# c 3 4;;
- : '_a -> int = <fun>
# c 3 4 5;;
- : int = 4

有的函数没有参数,但又不能为了防止编译器将函数误认为变量定义,需要加()表示没有参数。()等同于unit。

递归函数相对于普通函数的区别是要在在函数名称前面加了一个rec,如果不加rec,那么编译器会报错。之所以加rec的原因是因为Ocaml在一个函数被完全声明前,并不知道自己连接的是哪一个。

7、算术逻辑运算符

Ocaml中没有一元算术运算符,只有二元逻辑运算符;

在Ocaml中整数和浮点数不能进行混合运算,如果一个整数和一个浮点数之间要进行算术运算,必须通过转换函数把整数转换成浮点数或者浮点数转换为整数,才能进行运算,否则代码编译会报错;

1)、字符串连接操作符 ^

示例:”123”^”456” 的值为”123456”

2)、List连接运算符 @

3)、取引用运算符 !

4)、引用赋值运算符 :=