由于项目需要,需要研究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)、引用赋值运算符 :=
转载于:https://blog.51cto.com/upkevin/778151