每月练习中的数字(如何不返回任何内容而不是SML中的空列表)

每月练习中的数字(如何不返回任何内容而不是SML中的空列表),sml,smlnj,Sml,Smlnj,我正在用SML做一个编程作业。其中一个函数要求我返回用于其他列表的int((int*int*int)list)的三元组列表。该函数对日期和月份进行排序,查看它们是否一致,如果一致,则将其添加到列表中。这是代码 fun dates_in_month (dates : (int * int * int) list, month : int) = if null dates then [] else if #2 (hd dates) = month

我正在用SML做一个编程作业。其中一个函数要求我返回用于其他列表的int((int*int*int)list)的三元组列表。该函数对日期和月份进行排序,查看它们是否一致,如果一致,则将其添加到列表中。这是代码

fun dates_in_month (dates : (int * int * int) list, month : int) =
    if null dates
    then []
    else
        if #2 (hd dates) = month
        then (hd dates) :: dates_in_month(tl dates, month)
        else dates_in_month(tl dates, month)

fun dates_in_months (dates : (int * int * int) list, months : int list) =
    if null months orelse null dates
    then []
    else
        dates_in_month(dates, hd months) ::
        dates_in_months(dates, tl months)
使用此代码在一定程度上有效,但是函数返回的是(int*int*int)列表,而不是(int*int*int)列表。我认为问题在于
然后[]
语句。任何帮助都将不胜感激。

问题不在于
那么[]
,问题在于:

dates_in_month(dates, hd months) ::
dates_in_months(dates, tl months)
在这里,您可以获取
dates\u in_month(dates,hd months)
的结果,这是一个列表,并将其用作
的第一个参数。正如您所知,
h::t
生成一个列表,其第一个元素是
h
。因此,在本例中,您将创建一个列表,其第一个元素是列表。也就是说,您正在创建一个列表列表


既然您不希望这样,就不应该使用
。您可以使用
@
,它将两个列表作为其操作数并将它们连接起来。因此,虽然
[1,2]::[3,4]:[]
会产生
[1,2],[3,4]
[1,2]@[3,4]@[]
会产生
[1,2,3,4]
,这是你想要的。

问题不是
那么[]
,问题在于:

dates_in_month(dates, hd months) ::
dates_in_months(dates, tl months)
在这里,您可以获取
dates\u in_month(dates,hd months)
的结果,这是一个列表,并将其用作
的第一个参数。正如您所知,
h::t
生成一个列表,其第一个元素是
h
。因此,在本例中,您将创建一个列表,其第一个元素是列表。也就是说,您正在创建一个列表列表


既然您不希望这样,就不应该使用
。您可以使用
@
,它将两个列表作为其操作数并将它们连接起来。所以当
[1,2]::[3,4]:[]
将产生
[1,2],[3,4]
[1,2]@[3,4]@[]
将产生
[1,2,3,4]
,这就是你想要的。

哇,谢谢你的快速回复!回顾编程作业,老师提到了“@”操作符。我想我应该学习阅读,是吗?谢谢你保存我的成绩!哇,谢谢你的快速回复!回顾编程作业,老师提到了“@”操作符。我想我应该学习阅读,是吗?谢谢你保存我的成绩!