如何比较和搜索列表中的元素与列表 SML 中的元组

How to compare and search for an element in a list with a tuple inside a list SML

我想在元组列表中的每个第二个元素内搜索 searchingElements 列表,并计算元组列表内的列表中是否有月份,如测试所示,我不知道是否应该通过递归完成,我不知道如何在这里使用。

fun number_in_months(months : (int * int * int) list, months2 : (int * int * int) list, 
                      months3 : (int * int * int) list, searchingElements : int list) =
    

  if #2 (hd (tl months)) = (hd searchingElements)
  then
    1 
  else
    0

val test3 = number_in_months ([(2012, 2, 28), (2013, 12, 1), (2011, 3, 31), (2011, 4, 28)], [2, 3, 4]) = 3

我收到这 2 个错误,我后来才明白我无法比较列表和元组列表

(fn {1=1,...} => 1) (hd number)
  main.sml:30.2-30.30 Error: operator and operand do not agree [overload - bad instantiation]
  stdIn:2.1-2.5 Error: unbound variable or constructor: fun3

如果我们阅读功能代码和测试,那真的会产生误导,因为它们从一开始就类型不一致。

如果我按照测试函数

val test3 = number_in_months ([(2012,2,28),(2013,12,1),(2011,3,31),(2011,4,28)],[2,3,4]) = 3

那么number_in_months的类型应该是

val number_in_months = fn: ('a * ''b * 'c) list * ''b list -> int

这是一对(二元组)和应该实现逻辑的函数

fun fun3 (months :(int*int*int) list, months2: (int*int*int) list, months3: 
 (int*int*int) list, searchingElements: int list)

实际上是一个参数为4元组的函数,不匹配是显而易见的。此外,参数 months2months3 未在任何地方使用。另外,每个所谓的 months 参数本身都是列表类型。此外,除了 test3 行,没有任何内容可以得出答案甚至回复。

但是,在 test3 行之后,我试图编写一个函数,至少可以完成任务,如下所示:

fun number_in_months (date_triples, months) =
    let
      fun is_second_of_any_triple ele = List.exists (fn (_, x, _) => x = ele)
    in
      List.foldl (fn (curr, acc) => if is_second_of_any_triple curr date_triples then acc + 1 else acc) 0 months
    end

具有显式递归的版本:

假设我们有一个函数计算元组列表中单个数字的出现次数;

month_occurrences: ((int * int * int) list * int) -> int

然后我们可以递归遍历数字列表,边走边添加:

fun number_in_months(dates, []) = 0
  | number_in_months(dates, m::ms) = month_occurrences(dates, m) + number_in_months(dates, ms)

并且month_occurrences直接递归可能看起来像

fun month_occurrences([], _) = 0
  | month_occurrences((_, m, _)::ds, m') = (if m = m' then 1 else 0) + month_occurrences(ds, m')