【问题标题】:Using List.exists, List.for_all, and List.filter together in OCaml在 OCaml 中同时使用 List.exists、List.for_all 和 List.filter
【发布时间】:2018-10-03 23:48:45
【问题描述】:

我正在尝试通过这些类型中列表的内容过滤用户定义类型的列表,我想知道是否有一种方法可以使用 List.filterList.existsList.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]

有没有办法只使用这些 List 函数来创建不是某种颜色的猫的列表?这是一个家庭作业问题,所以我不能真正包含我的代码,但我添加了一个函数来隔离类型中的颜色列表,然后比较这些列表

谢谢!

【问题讨论】:

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

标签: ocaml higher-order-functions


【解决方案1】:

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

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])]

其余的应该可以使用两个应用程序List.for_all (作为一个逻辑公式:∀c1:颜色∀c2:cat_cols。c1≠c2)。将鼠标悬停在扰流块上以显示完整的解决方案:

let choose colors = List.filter (function Cat (_,_,catcols) -> List.for_all (fun col -> List.for_all ((!=) col) catcols) colors )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2017-02-13
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多