我需要列出日期和月份列表,并获得列出的任何月份的日期总数。因此返回一个整数
我有一个先前定义的number_in_month
函数,它接受一个列表
日期和单个月,并返回该日期的数量
月。它已经过测试并且工作正常。我以此为基础
后者的功能。我已经通过许多number_in_months
函数进行了追踪
时间,我似乎无法发现什么是错的,但它根本没有产生正确的答案
fun number_in_month (datelist : (int*int*int)list, month : int) =
let
fun count(x : int , datelist : (int*int*int)list)=
if null (tl datelist)
then x
else if #2(hd datelist) = month
then count(x+1, tl datelist)
else count(x, tl datelist)
in
if #2(hd datelist) = month
then count(1, datelist)
else count(0, datelist)
end
fun number_in_months (datelist : (int*int*int)list, monthlist : (int)list)=
let
fun count(x : int, monthlist : (int)list)=
if null (tl monthlist)
then x
else count((x + number_in_month(datelist, hd monthlist)), tl monthlist)
in
count (( number_in_month(datelist, hd monthlist), tl monthlist))
end
答案 0 :(得分:7)
正如您所说,您只需使用上一个功能number_in_month
。请记住,number_in_month
会获取日期和单个月的列表,并返回日期列表中匹配月份的数量。因此,创建number_in_months
所需的全部内容,就是为新月份列表中的每个元素调用number_in_month
,并使用原始的日期列表进行检查。
这样的解决方案看起来像
fun number_in_months (dates, months) =
if null months then
0
else
number_in_month(dates, hd months) + number_in_months(dates, tl months)
但是,当您使用模式匹配时,可以将其缩短并使其更具可读性
fun number_in_months (dates, []) = 0
| number_in_months (dates, d::ds) =
number_in_month(dates, d) + number_in_months(dates, ds)
绝对没有理由创建一个带有“状态”的count
函数。这似乎是你的必要思想,在玩:)
例如,这个简单的函数将汇总列表的所有元素
fun sum [] = 0
| sum (x::xs) = x + sum xs
甚至创建一个长度函数(实际上与你的计数函数类似)
fun length [] = 0
| length (x::xs) = 1 + length xs
我鼓励你去阅读这些questions及其答案,而不是重复已经多次提及的很多好东西。
<强>更新强>
我还想向您展示如何以更好的方式格式化代码
fun number_in_month (datelist : (int*int*int) list, month : int) =
let
fun count (x : int , datelist : (int*int*int) list) =
if null (tl datelist)
then x
else if #2(hd datelist) = month
then count (x+1, tl datelist)
else count (x, tl datelist)
in
if #2(hd datelist) = month
then count (1, datelist)
else count (0, datelist)
end
fun number_in_months (datelist : (int*int*int) list, monthlist : int list)=
let
fun count (x : int, monthlist : int list)=
if null (tl monthlist)
then x
else count (x + number_in_month(datelist, hd monthlist), tl monthlist)
in
count (number_in_month (datelist, hd monthlist), tl monthlist)
end
如何格式化嵌套if如果我来自的话总是很有争议。我个人避免使用它们,而是使用案例,但我想你将来会依赖它。
但是我也发现了你的计数功能错误。当你测试你的第二个参数(在你的两个计数函数中)是否是带有null
的空列表时,你是在参数的尾部进行的,如果参数实际上是空列表,它将失败
- null (tl []);
uncaught exception Empty
例如这个输入
- number_in_months ([(1,1,1)], [1]);
uncaught exception Empty
此外,number_in_month
中的逻辑错误,因为您正在测试datelist
的头部等于month
,但无论如何使用count
整个datelist
而不是它的尾巴。这被视为下面不应该返回2
- number_in_month([(1,1,1), (2,2,2), (3,3,3)], 1);
val it = 2 : int
这个错误是使number_in_month
函数不会抛出异常的唯一因素。
答案 1 :(得分:1)
您的代码存在的问题是,如果与月份匹配,则不计算上次日期。这段代码工作正常。
fun number_in_month (datelist : (int*int*int) list, month : int) =
let
fun count (x : int , datelist : (int*int*int) list) =
if null (tl datelist)
then
if #2(hd datelist) <> month
then x
else x+1
else if #2(hd datelist) = month
then count (x+1, tl datelist)
else count (x, tl datelist)
in
count (0, datelist)
end