我正在尝试创建一个辅助函数,可以使用像[Some 3;没有;大约5;有些10] = [3; 5; 10]并输出整数,如图所示。但是我收到了解析错误,不知道该怎么办。
apfold.ml“,第32行,字符11-12: 解析错误:在[patt_as_patt_opt]之后预期[opt_when_expr](在[match_case0]中
行号是指带有|的行[Some] [int] = [int]
这是迄今为止的功能:
let rec difference (thelist:'a option list) : 'a list =
match thelist with
| [Some] [int] -> [int]
;;
功能差异插入到此:
let deoptionalize (lst:'a option list) : 'a list =
List.filter ~f:(fun lst -> difference)
;;
虽然,如果有一种方法可以在不使用帮助函数的情况下执行deoptionalize函数,我非常感谢任何帮助来解决这个问题。
答案 0 :(得分:1)
您的错误来自[Some] [int]
:这不是有效的OCaml模式。
关于使用List.filter然后使用List.map,在列表中两次使用是没有用的。您可以使用List.fold_right
:
let remove_options l = List.fold_right
(fun x result ->
match x with
| Some i -> i :: result
| None -> result )
l []
通过这种方式,您可以浏览一次列表并避免分配中间列表。
答案 1 :(得分:0)
感谢Jeffrey Scofield和我自己的一些想法,我们确定一个很好的方法是使用List.map和List.filter将None与Some分开,然后从内部提取int。内部函数可以是辅助函数或内联函数;这是一种风格偏好。
答案 2 :(得分:0)
从OCaml版本4.08开始,现在可以很容易地通过组合标准库中的List.filter_map
(doc)和Fun.id
(doc)函数来完成此操作:
List.filter_map Fun.id [Some 3; None; Some 5; Some 10];;
(* returns [3; 5; 10] *)
相关问题(如果使用基础/核心库):ocaml - deoptionalize a list: is there a simpler way?