Ocaml 的入門整理 1

2021-05-09 12:53:15 字數 3220 閱讀 4905

最近開始接觸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的理...