Ocaml在线运行

版本:
运行结果
教程手册
代码仓库
极速运行
交互输入
极速运行模式,更高效的运行,点击编辑器上方的运行按钮即刻体验吧。
以下是用户最新保存的代码
你们是垃圾看你 发布于:2020-11-19 20:15 [更多]
显示目录

常见错误



常见错误

使用错误的运算符

在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> *)

通过将这些模式组合在一起,我们可以处理任何任意复杂的列表。

由JSRUN为你提供的Ocaml在线运行、在线编译工具
        JSRUN提供的Ocaml在线运行,Ocaml 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。

title

使用此草稿 删除草稿

  • 00:23
注册登录后可减少验证码的弹出,点击前往 注册 | 登录

皮肤:

运行模式:

嵌入代码 iframe嵌入: