0

我正在使用 SML 进行编程作业。其中一个功能要求我将使用的整数三元组列表( (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 []声明上。任何帮助,将不胜感激。

4

1 回答 1

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],这就是您想要的。

于 2013-01-24T19:14:51.493 回答