Function OCaml:遍历列表并跳过错误构造函数的元素

Function OCaml:遍历列表并跳过错误构造函数的元素,function,pattern-matching,ocaml,loops,Function,Pattern Matching,Ocaml,Loops,这似乎是一件奇怪的事情,当然欢迎你提出更好的方法 我的目标是: 我想滚动浏览传递到函数中的列表的每个元素。如果它是构造函数Y,那么我想对它调用一些函数。如果是构造函数Z,我想跳过它 如果有一种方法可以在If语句中检查这一点,那么这似乎是一种方法,因为我不需要编写else。然而,我只知道如何在比赛中检查这一点 例如: let myFunct list = List.iter (fun x -> match x with | Y y -> otherFunctio

这似乎是一件奇怪的事情,当然欢迎你提出更好的方法

我的目标是:

我想滚动浏览传递到函数中的列表的每个元素。如果它是构造函数Y,那么我想对它调用一些函数。如果是构造函数Z,我想跳过它

如果有一种方法可以在If语句中检查这一点,那么这似乎是一种方法,因为我不需要编写else。然而,我只知道如何在比赛中检查这一点

例如:

let myFunct list = 
List.iter (fun x -> match x with
           | Y y -> otherFunction y
          ) list;;
现在,这给了我一个关于不能处理Z的警告。所以我可以在那里扔一些东西,比如

let myFunct list = 
List.iter (fun x -> match x with
           | Y y -> otherFunction y
           | Z z -> (*skip*)
          ) list;;
当然,我不能把Z的匹配留白


如何完成我要做的事情?

您可以使用
List.filter
根据条件过滤列表,然后在过滤列表上使用
List.iter

有关列表模块中方法的更多信息,请参阅此处的文档

我目前没有访问OCaml编译器的权限,但是代码看起来像这样:

List.iter(fun x->…)(List.filter(fun x->…)mylist)
只需返回单元(即,
()
)即可
Z
案例

是否确实要
列表.iter
。它主要用于应用一个函数以消除其副作用


函数程序中更惯用的方法是使用
list.filter
,过滤列表,然后使用
list.map
,Lambdageek对
list.iter
的回答是正确的。您只需要在没有任何事情要做的情况下使用()作为结果。执行迭代时,
match
表达式的所有不同大小写都应该返回()。这就是《国际热核实验堆》的全部内容

其他人(在我看来,这是正确的)担心您可能并不真的想使用
List.iter
。当来自其他(命令式)语言时,这可能是您想到的第一件事,但在进行函数式编程时,迭代本身并没有那么常用。如果您是在某种课程中学习OCaml,那么使用
List.iter
的可能性更小。关于OCaml的课程肯定会从涵盖功能部分开始。要从功能上考虑,您需要考虑将值从一种形式转换为另一种形式(即,将函数应用于它们)

假设您确实想使用
List.filter
。然后,正如您所说,您将最终执行一个
匹配
表达式,但是在所有不同的情况下,您不需要返回(),而是希望在每种情况下都返回一个布尔值(true或false)。如果返回true,则该值将包含在结果列表中。如果返回false,则该值不会包含在结果列表中。再一次,这就是
List.filter
的全部内容。下面的一些代码返回一个新列表,其中只包含具有Z构造函数的给定列表的元素

let myFunc list =
    List.filter
        (fun x -> match x with Z _ -> true | _ -> false)
        list

我不确定这是否有帮助,但我想说的是,使用
match
并不困难。你只需要涵盖每一个案例。这很好,您希望您的代码在任何情况下都能工作

(只是一个术语说明。列表的所有元素都是相同类型的。OCaml的强类型强制执行这一点。您所说的是相同类型的不同构造函数。)我建议不要使用“类型”这个词,因为它意味着同一个列表可以包含不同类型的元素。“Constructor”可能是一个重载较少的同义词。“fun x->match x with Y->…|Z->…”可以更简单地写为“function Y->…|Z->…”我不明白这里如何使用List.filter。据我所知,拥有一个特定的构造函数不是一个可以检查的条件,而是需要匹配的条件。我错了吗?我将如何实现这一点?我的问题是如何基于构造函数进行匹配,我仍然必须在筛选函数中进行匹配。@CaseyPatton啊,好的-我没有抓住你问题的要点。是的,您仍然需要使用匹配语句。我不知道还有什么其他方法可以做到这一点。我不同意先应用
List.filter
来创建一个中间列表,然后再应用
List.map
是一种很好的风格。@Pascal我认为这对于一个刚刚接触函数式语言的人来说是一种很好的学术技巧。
List.filter\u map
营救