学习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>
相关文章推荐
- php简单smarty入门程序实例
- Linux-理解 Linux 的硬链接与软链接
- Android客户端与服务器端通过DES加密认证
- 常见的OnActivityForResult 方法接收回调问题
- twisted入门
- 图像分割
- HTTP状态码大全
- Excel Sheet Column Number -LeetCode
- [MapReduce] Google三驾马车:GFS、MapReduce和Bigtable
- android推送方式
- linux下创建和删除软、硬链接
- C实现 LeetCode->Roman to Integer
- adb shell am 的用法
- 为新建程序分配TCODE
- 查找表
- Hadoop安装求助
- Java模式(适配器型号)
- 01背包问题
- show processlist 各个状态说明
- Palindrome Partitioning