如何比较和搜索列表中的元素与列表 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元组的函数,不匹配是显而易见的。此外,参数 months2
和 months3
未在任何地方使用。另外,每个所谓的 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')
我想在元组列表中的每个第二个元素内搜索 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元组的函数,不匹配是显而易见的。此外,参数 months2
和 months3
未在任何地方使用。另外,每个所谓的 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')