列表过滤器然后在 OCaml 中列出地图
List filter then List map in OCaml
如何在 OCaml 中的列表映射之前应用列表过滤器?我正在尝试管道运算符但没有成功:
let r infile =
match List.tl (In_channel.read_lines infile ) with
| None -> []
| Some body ->
List.filter body ~f:(fun line -> true)
|> List.map body ~f:(fun line ->
match split_on_comma line with
| _ :: _ :: num :: street :: unit :: city :: _ :: region :: _ ->
String.strip (num ^ " " ^ addr_case street ^ ", " ^ addr_case city ^ " " ^ region)
| _ -> assert false)
utop 给我:
"这个表达式的类型是字符串列表
但表达式应为字符串列表类型 -> 'a"
我知道 List.filter 目前什么都不做。我只是想在 List.map
之前使用它
标准 OCaml List.filter 没有 ~f:
参数。您很可能正在使用 Core。
我现在没有设置核心,所以无法测试。但一个可能的问题是您在 List.map
调用中使用了 body
。我认为你应该把它留在外面。您想要处理 List.filter
表达式的结果。您不想处理正文,这是匹配项的原始值。
下面是使用函数的 OCaml 标准库版本的类似表达式:
# ListLabels.filter [1; 2; 3; 4]
~f: (fun x -> x mod 2 = 0) |>
ListLabels.map ~f: (fun x -> x + 10) ;;
- : int list = [12; 14]
如何在 OCaml 中的列表映射之前应用列表过滤器?我正在尝试管道运算符但没有成功:
let r infile =
match List.tl (In_channel.read_lines infile ) with
| None -> []
| Some body ->
List.filter body ~f:(fun line -> true)
|> List.map body ~f:(fun line ->
match split_on_comma line with
| _ :: _ :: num :: street :: unit :: city :: _ :: region :: _ ->
String.strip (num ^ " " ^ addr_case street ^ ", " ^ addr_case city ^ " " ^ region)
| _ -> assert false)
utop 给我:
"这个表达式的类型是字符串列表 但表达式应为字符串列表类型 -> 'a"
我知道 List.filter 目前什么都不做。我只是想在 List.map
之前使用它标准 OCaml List.filter 没有 ~f:
参数。您很可能正在使用 Core。
我现在没有设置核心,所以无法测试。但一个可能的问题是您在 List.map
调用中使用了 body
。我认为你应该把它留在外面。您想要处理 List.filter
表达式的结果。您不想处理正文,这是匹配项的原始值。
下面是使用函数的 OCaml 标准库版本的类似表达式:
# ListLabels.filter [1; 2; 3; 4]
~f: (fun x -> x mod 2 = 0) |>
ListLabels.map ~f: (fun x -> x + 10) ;;
- : int list = [12; 14]