常见错误
编辑教程常见错误
使用错误的运算符
在OCaml中,浮点数和整数有不同的算术运算符。此外,这些运算符只能用于2个浮点数或2个整数。这是OCaml中的无效表达式
1.0 + 2.0
1 + 2.0
1 +. 2
1 +. 2.0
这些中的每一个的正确表达分别是
1. +. 2.
float_of_int 1 +. 2.
1 + 2
float_of_int 1 +. 2.
在OCaml中没有自动将整数转换为浮点数,反之亦然。一切都是明确的。这是整数和浮点运算符的列表
远算符 | 表达式 | 示例 |
---|---|---|
+ | a + b | c +. d |
- | a - b | c -. d |
* | a * b | c *. c |
/ | a / b | c /. d |
系数 | a mod b | modfloat cd |
幂 | N / A | c ** d |
其中a和b是整数, c和d是浮点数。
忘记函数参数周围的括号
一个常见的错误是忘记带括号的周围复合函数参数,从而导致类型错误。
# string_of_int 1+1;;
Error: This expression has type string but an expression was expected of type int
这是因为优先权。事实上,以上评估为
# (string_of_int 1) + 1;;
这是错的。一个正确的语法
# string_of_int (1+1);;
- : string = "2"
具有模式匹配的递归列表处理
例 这里我们演示如何使用OCaml的模式匹配语法递归处理列表。
let rec map f lst =
match lst with
| [] -> []
| hd::tl -> (f hd)::(map f tl)
在这种情况下,pattern []匹配空列表,而hd::tl匹配任何至少有一个元素的列表,并将列表的第一个元素分配给hd和列表的其余部分(可能为空)到tl 。
请注意, hd::tl是一种非常通用的模式,它将匹配任何非空的列表。我们还可以编写与具有特定数量元素的列表匹配的模式:
(* Return the last element of a list. Fails if the list is empty. *)
let rec last lst =
match lst with
| [] -> failwith "Empty list"
| [x] -> x (* Equivalent to x::[], [x] matches a list with only one element *)
| hd::tl -> last tl
(* The second to last element of a list. *)
let rec second_to_last lst =
match lst with
| [] -> failwith "Empty list"
| x::[] -> failwith "Singleton list"
| fst::snd::[] -> snd
| hd::tl -> second_to_last tl
此外,OCaml支持列表本身元素的模式匹配。我们可以更具体地了解列表中元素的结构,OCaml将推断出正确的函数类型:
(* Assuming a list of tuples, return a list with first element of each tuple. *)
let rec first_elements lst =
match lst with
| [] -> []
| (a, b)::tl -> a::(first_elements tl)
(* val first_elements : ('a * 'b) list -> 'a list = <fun> *)
通过将这些模式组合在一起,我们可以处理任何任意复杂的列表。
Mos固件,小电视必刷固件
ES6 教程
Vue.js 教程
JSON 教程
jQuery 教程
HTML 教程
HTML 5 教程
CSS 教程
CSS3 教程
JavaScript 教程
DHTML 教程
JSON在线格式化工具
JS在线运行
JSON解析格式化
jsfiddle中国国内版本
JS代码在线运行
PHP代码在线运行
Java代码在线运行
C语言代码在线运行
C++代码在线运行
Python代码在线运行
Go语言代码在线运行
C#代码在线运行
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。
大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
选择支付方式:
立即支付
¥
9.99
无法付款,请点击这里
金额: 0 元
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟