在OCaml中同时使用List.exists、List.for_all和List.filter

在OCaml中同时使用List.exists、List.for_all和List.filter,ocaml,higher-order-functions,Ocaml,Higher Order Functions,我正试图通过这些类型中列表的内容来过滤用户定义类型的列表,我想知道是否有一种方法可以使用list.filter、list.exists和list.for_all来访问该内部列表,而不是使用函数来访问它 type weight = int type height = int type colours = Red | Black | Orange | White type cat = Cat of weight * height * colours list let cat1 = Cat (14

我正试图通过这些类型中列表的内容来过滤用户定义类型的列表,我想知道是否有一种方法可以使用
list.filter
list.exists
list.for_all
来访问该内部列表,而不是使用函数来访问它

type weight = int
type height = int 
type colours = Red | Black | Orange | White
type cat = Cat of weight * height * colours list

let cat1 = Cat (14, 14, [Red; Black])
let cat2 = Cat (15, 20, [Black; White])
let cat3 = Cat (13, 15, [Red; White])
let cats =  [cat1; cat2; cat3]
有没有办法只使用这些列表功能来创建一个不是特定颜色的猫的列表?这是一个家庭作业问题,所以我不能真正包含我的代码,但我添加了一个函数来隔离类型中的颜色列表,然后比较这些列表


谢谢大家!

您可以对应用于过滤器的函数进行模式匹配。要查找所有非黑色或体重小于14的猫,您可以使用:

utop # List.filter (function Cat (_,_,cat_colors) ->
                             List.for_all (fun x -> x != Black)
                             cat_colors ) cats ;;
- : cat list = [Cat (13, 15, [Red; White])]


utop # List.filter (function Cat (weight,_,_) -> weight < 14) cats ;;
- : cat list = [Cat (13, 15, [Red; White])]
utop#List.filter(函数Cat(u,u,Cat_颜色)->
List.for_all(乐趣x->x!=黑色)
猫(颜色)猫;;
-:猫列表=[猫(13,15,[红色;白色])]
utop#List.filter(功能猫(重量,,)->重量<14)猫;;
-:猫列表=[猫(13,15,[红色;白色])]
其余部分应可用于两个应用程序
列表。对于所有应用程序
(作为逻辑公式:∀c1:颜色∀c2:类别c1≠ c2)。将光标悬停在扰流块上,以显示完整的解决方案:

让我们选择颜色=
List.filter(函数Cat(,,catcols)->
List.for_all(乐趣列->
List.for_all((!=)col)catcols)颜色)


cats的类型定义不符合您的匹配语句。我把它删掉了,请告诉我是否有其他意图。@lambda.xy.x谢谢!包含类型定义只是为了给出问题的概念,而不是我正在处理的实际类型定义;我只是停留在如何比较这些类型列表中的类型列表上。我将对其进行编辑,使其更具概念性:这是一个家庭作业问题,明天我将发布完整答案,但给你一个提示today@lambda.xy.x非常感谢。当列表函数嵌套在彼此内部时,我对它们采用什么参数感到困惑