制作帮助函数,将“列表与”选项列表分开

时间:2015-02-20 21:26:15

标签: ocaml

我正在尝试创建一个辅助函数,可以使用像[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函数,我非常感谢任何帮助来解决这个问题。

3 个答案:

答案 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?