如何在SML中返回任何内容而不是空列表

时间:2013-01-24 19:06:48

标签: 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
        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)列表。我认为问题在于 then []声明。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

问题不在于then [],问题在于:

dates_in_month(dates, hd months) ::
dates_in_months(dates, tl months)

在这里,您获取dates_in_month(dates, hd months)的结果,这是一个列表,并将其用作::的第一个参数。如您所知,h :: t生成一个列表,其第一个元素是h。因此,在这种情况下,您将创建一个列表,其第一个元素是列表。那就是你要创建一个列表列表。

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