微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回包含有效元素的列表

如何解决返回包含有效元素的列表

我想创建一个返回有效元素的函数

(* Return true if the square given (c) is in the grid (m*n) *)
let is_valid m n c =
  List.mem c (range2 m n)
;;

(* Return the list of the neighbours of a square in a grid(m*c) *)
let get_neighbours m n c =
  let (x,y) = c in [(x-1,y);(x,y+1);(x+1,y-1)]
;;

所以我没有成功做的是一个函数,它使用另外两个函数来返回一个正方形的邻居列表,但前提是它们在网格中。

我尝试过 List.fold_left、List.map 但每次都说给定的类型不正确。

(* this is what i tried to make*)

let verif m n c = 
  let a = (get_neighbours m n c) in
  List.map (a -> is_valid m n a) 
;;

Type Cell 是这样给出的:

module Cell =
struct
  type t = int * int
  let compare = Pervasives.compare
end
;;

module CellMap = Map.Make(Cell);;
module CellSet = Set.Make(Cell);;
type grid = CellSet.t CellMap.t;;

更新

感谢 Jeffrey Scofield,我找到了解决方案:

let is_valid_list m n c =
  List.filter (function x -> is_valid m n x) (get_neighbours m n c)
;;

谢谢他。

解决方法

我认为,最初的问题是 List.map 是一个将其每个输入转换为输出的函数。输入和输出列表的长度总是相同的。

在我看来,您想返回一个可能较小的列表。您要做的是过滤掉无效元素。 List 模块中有一个名为 List.filter 的函数可以执行此操作。

您的其他问题可能是由于 List.map 不可用造成的。但作为旁注,您对 List.map 的调用是无效的 OCaml。 List.map 的参数是一个函数和一个列表。您正在传递一个在 OCaml 中看起来不像任何有效参数的参数。它类似于函数定义的片段。

List.filter 的参数是:一个返回布尔值的函数(就像 is_valid)和一个列表(就像你的列表 a)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。