您的位置:首页 > 其它

学习ocaml----(3)基础

2015-06-11 11:31 585 查看

List

List在ocaml中地位重要,所有的函数式语言也都如此。

List只能包含相同类型的元素,元素个数可以变化。

但,List是不能改变的(immutable),我们对List操作,充其量只会产生新的List。

List常量:

# let a = [1;3;6];;
val a : int list = [1; 3; 6]

注意:元素间用分号分开。之所以不用逗号,是因为逗号用于创建另一种数据 Tuple(后边述及)
把一个元素加入到List的前边:

# let b = 99 :: a;;
val b : int list = [99; 1; 3; 6]
# a;;
- : int list = [1; 3; 6]

注意,操作后生成新的list,而a绑定的还是原来的list
实际上,[1;2;3] 的写法只是一种语法糖,它的正式写法是:

# 1::2::3::[];;
- : int list = [1; 2; 3]

:: 操作符是向右边结合的,所以,上边的写法等价于:
# 1::(2::(3::[]));;
- : int list = [1; 2; 3]

可以求一个列表的长度:
# List.length b;;
- : int = 4

可以连接两个列表:
# a @ b;;
- : int list = [1; 3; 6; 99; 1; 3; 6]

可以求一个列表的头(是一个元素)和尾(是一个列表):
# List.hd a;;
- : int = 1
# List.tl a;;
- : int list = [3; 6]

可以求列表的第n个元素:
# List.nth b 2;;
- : int = 3

可以对一个列表翻转:
# List.rev a;;
- : int list = [6; 3; 1]

更重要的是,可以对列表应用各种高阶函数,最常见的是map
# List.map (fun x->x+1) a;;
- : int list = [2; 4; 7]

Tuple

用逗号分开的表达式可以看做一个联合的数据,名为tuple

# let a = 1,2;;
val a : int * int = (1, 2)
# let b = (5,6);;
val b : int * int = (5, 6)

可以用匹配表达式来析构tuple:
# let x,y = a;;
val x : int = 1
val y : int = 2
# let x,y=y,x;;
val x : int = 2
val y : int = 1

函数的参数和返回值当然也可以是tuple
# let f (x1,y1) (x2,y2) = x1+x2,y1+y2;;
val f : int * int -> int * int -> int * int = <fun>
# f a b;;
- : int * int = (6, 8)

java,c中都不能返回多个值,但使用tuple可以达到返回多个值的效果。
比如,整数除法,同时返回商和余数:

# let div x y = x/y,x mod y;;
val div : int -> int -> int * int = <fun>
# div 10 3;;
- : int * int = (3, 1)

匿名函数

函数式语言中,函数是核心。

可以像定义普通常量那样,定义一个字面函数量,也就是没有名字的函数:

# fun x -> x + 1;;
- : int -> int = <fun>

可以把函数字面量(也叫匿名函数)绑定到某个标示符:
# let f = fun x -> x + 1;;
val f : int -> int = <fun>

这与如下的写法本质是一样的:
# let f x = x + 1;;
val f : int -> int = <fun>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: