упражнение number_in_month (Получение EQUAL. Ошибка OP в SML, одна функция работает, другая - нет) - PullRequest
0 голосов
/ 10 февраля 2020

(* Напишите функцию number_in_month, которая принимает список дат и месяца (т. Е. Int) и возвращает количество дат в списке за данный месяц. *)

fun number_in_month(datelist : (int*int*int) list, month : int) =
    if null(tl (datelist))
    then if #2(hd (datelist)) = month then 1 else 0
    else if #2(hd (datelist)) = month
               then 1 + number_in_month(tl datelist, month)
               else number_in_month(tl datelist, month)

( * Напишите функцию number_in_months, которая принимает список дат и список месяцев (т.е. список int) и возвращает количество дат в списке дат, которые находятся в любом из месяцев в списке месяцев. Предположим, список число месяцев не повторяется. Подсказка: используйте ваш ответ на предыдущую задачу. *)

fun number_in_months(datelist : (int*int*int) list, monthlist : int list)
    if null(tl (monthlist))
    then number_in_month(datelist, hd monthlist)
    else number_in_month(datelist, hd monthlist)
         + number_in_months(datelist, tl monthlist)

Вторая функция выдает мне эту ошибку, когда я пытаюсь ее скомпилировать:

hw1.sml:42.5 Error: syntax error: inserting  EQUALOP
[unexpected exception: Compile]

uncaught exception Compile [Compile: "syntax error"]
  raised at: ../compiler/Parse/main/smlfile.sml:19.24-19.46
             ../compiler/TopLevel/interact/evalloop.sml:45.54
             ../compiler/TopLevel/interact/evalloop.sml:306.20-306.23
             ../compiler/TopLevel/interact/interact.sml:65.13-65.16

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

«синтаксическая ошибка: вставка EQUALOP» означает, что SML ожидает символ =.

Сообщения об ошибках от SML / NJ - одна из тех вещей, которые не улучшились ни на шаг за последние двадцать лет. Они часто сообщают о том, что делает синтаксический анализатор, чтобы попытаться восстановиться после ошибки, а не о том, какой может быть ошибка.

Рекурсию списка (и большинство всего остального) гораздо лучше написать с сопоставлением с шаблоном, чем с условными и селекторы:

fun number_in_month ([], _) = 0
  | number_in_month ((_, m, _)::ds, m') = (if m = m' then 1 else 0) + number_in_month(ds, m');

fun number_in_months (_, []) = 0
  | number_in_months (ds, m::ms) = number_in_month(ds, m) + number_in_months(ds, ms);

Это также позволяет SML сообщать вам, когда вы забыли случай, например случай пустого списка (о котором вы забыли).

0 голосов
/ 10 февраля 2020

Ответ: Забыл знак =. Это правильно:

fun number_in_months(datelist : (int*int*int) list, monthlist : int list) = 
    if null(tl (monthlist))
    then number_in_month(datelist, hd monthlist)
    else number_in_month(datelist, hd monthlist)
         + number_in_months(datelist, tl monthlist)
...