由于項目需要,需要研究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";;
- : string = "wengchen"
也可以通過<-對引用進行指派
# e_rf.contents<-"wjf";;
- : 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 連接配接運算符@