最近開始接觸ocaml,一開始也是摸不著頭腦。看著ppt,學習一下。
ocaml 有幾個比較顯著的特徵
1.value 為中心
所有的一切都是value
一旦定義了就無法改變了
2.函式型的語言
函式也是value
3.具有嚴格的型別type
保障程式的安全
ml的有很多,比較有名的有ocaml(inria,france) sml(bell,lab&princeton usa) 順便提一下我們教授開發的nml(snu/kaist)
1.let
給value乙個名字
(* ex1.ml *)
let a = 10
let add x y =
x + y
let sumofsquare x y =
let sqx = x * x in
let sqy = y * y in
sqx + sqy
(* ex2.ml *)
let sumofsquare x y =
let square x = x * x in
square x + square y
2.if,match
判斷語句
(* ex3.ml *)
let iseven n =
if n mod 2 = 0 then true
else false
if 語句必須有完整的格式 if…then…else 因為 必須保證 n有乙個value
(* ex4.ml *)
let iseven n =
match n mod 2 with
0 -> true
| 1 -> false
和ex3.ml有相同的效果,只是換了一種形式 match…with 有點像switch
(* ex5.ml *)
let is3mulitple n =
match n mod 3 with
0 -> true
| _ –> false
_->false 表示除了0 以外的任意 integer 都是false
3.function
-3.1一般的函式
let iseven n =
if n mod 2 = 0 then true
else false
函式也是value,理解這點很重要
-3.2 沒有名字的函式
(fun x –>10+ x)
-3.3 遞迴函式
let rec fac n =
if n = 0 then 1
else n * fac(n-1)
遞迴函式的定義要有乙個 rec
4.型別 type
ocaml 可以自動判斷value的型別,這一點是很牛的,能夠避免很多因為型別宣告造成的錯誤
ocaml自身也帶有很多基本型別,int,string,list,tuple,record等
自己可以定義型別
5.比較嚴格的型別區分
5.12+2.5 是錯誤的表示式 int 和float 不能相加
=>(float_of_int 2) +. 2.5 這種才是正確的表達
float 的演算也是自己的符號 +. –. *. /.
5.2
對等的表示式的型別必須相同,比如if的分支,和c語言作乙個簡單的比較
(* c *)
int lucky()
}c的else 是乙個printf
(* ocaml *)
let rec lucky () =
let r = random.int 100 in
if r = 50 then
r else
(printf(「again/n」); lucky())
但是在ocaml 裡面else裡面也必須是和r 對等的表示式
6.list
相同型別value的排列
第乙個element和後面的elements分開
[1;2;3] = 1::[2;3] = 1::2::[3]
[「a」] = 「a」::
let ilist1 = [1; 2; 3]
let ilist2 = 4::ilist1
let ilist3 = ilist1@ilist2 //連線兩個list
let gethead l =
match l with
h::t –> h //h::t 表示乙個list type
| -> raise error
8.tuple
可以是各種型別的value的組合
let man = (「age」,24)
let input = (10,100,(fun x->x * x))
let get?rst l =
match l with
(f, _, _) –> f
9.record
標有名字的value的組合,和c語言的struct比較相似
type subject =
let getname r =
match r with
–> n
10. 自定義型別
可以方便的定義各種型別
給已經存在的type 新的名字標示
type value = int
type tree = leaf | node of value * tree * tree
(tree 是乙個type, 可以具有leaf 或者node )
let t = node (5, leaf, node (4, leaf, leaf))
let rec sum t =
match t with
node (v, t1, t2) -> v + sum t1 + sum t2
| leaf –> 0
10.1 自定義type的多樣性
type itree = leaf of int
| node of int * itree * itree
type 『a tree = leaf of 『a
| node of 『a * 『a tree * 『a tree
let a = leaf 5
let b = node(「b」,leaf」l」,leaf」r」)
物件的整理1
靜態物件 不需要建立,直接通過這個物件名字呼叫即可,內建物件 例項物件 通過建構函式建立出來,例項化的物件 math.pi math.abs 值 取絕對值 math.ceil 值 向上取整 math.floor 值 向下取整 math.round 值 四捨五入 math.max 值1,值2.取一堆數...
錯題整理(1)
1.charc 72 中的 72代表乙個字元,72是八進位制數,代表ascii碼字元 2.10 a 中a先進行乘法運算再自增 筆試中經常喜歡出這類運算子優先順序容易混淆的輸出問題 static關鍵字 1 函式體內static變數的作用範圍為函式體。不同於auto變數。該變數的記憶體只被分配一次。因此...
筆記整理1
說說對arraylist的理解 最常用的list實現類 內部是陣列實現的 允許對元素進行快速隨機訪問 缺點就是元素之間不能存在間隔 陣列大小不滿足時需要增加儲存能力,需要複製資料到新的儲存空間 當在中間增加元素時,需要批量的複製和移動,因此適合隨機查詢和遍歷,不適合插入和刪除。說說對vector的理...