0

私は SML でプログラミングの割り当てを行っています。関数の 1 つは、int の 3 つのタプル ( (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。したがって、この場合、最初の要素がリストであるリストを作成します。つまり、リストのリストを作成しています。

あなたはそれを望まないので、使用すべきではありません::@オペランドとして 2 つのリストを取り、それらを連結する を使用できます。だから、あなた[1,2] :: [3,4] :: []が望むものです。[[1,2], [3,4]][1,2] @ [3,4] @ [][1,2,3,4]

于 2013-01-24T19:14:51.493 に答える