Ошибка: синтаксическая ошибка: замена COLON на AS - PullRequest
0 голосов
/ 03 сентября 2018

это домашнее задание из курса ProgLang в Coursera, но срок обучения истек, и я только проверяю это. Это действительно дешевая проблема, но, похоже, я не могу сделать это в SML.

Учитывая список из трех кортежей даты int и int, вернуть, как часто это int соответствует # 2 кортежа (месяца).

Сначала у меня было много [несоответствий тайконов], а затем поиграли с заголовком функции. Я понятия не имею, как обозначить список кортежей, если не считать всего этого.

fun number_in_month (date : [int*int*int], month : int) : int =
if hd date = []
then 0
else
if #2 hd date = month
then
    1 + number_in_month tl date
else
    0 + number_in_month tl date

Не уверен насчет логики и конструкции if if else if. А что на земле есть КАК?

- use "hw1.sml";
[opening hw1.sml]
hw1.sml:13.26 Error: syntax error: replacing  COLON  with  AS
val it = () : unit

13: 26 - первое двоеточие заголовка. Может быть, я слишком оцепенел, чтобы гуглить, я не нашел ничего полезного.

1 Ответ

0 голосов
/ 03 сентября 2018

В SML тип списка записывается как elementType list, а не [elementType]. Таким образом, тип списка int-троек равен (int*int*int) list, а не [int*int*int].

Поэтому, когда SML видит [, он думает, что видит начало шаблона (в частности, шаблона списка), а не типа. Это заставляет думать, что : неверно (поскольку за : должен следовать тип), и алгоритм восстановления после ошибки заменяет его на as, потому что это будет допустимо между идентификатором и шаблоном.

А что на земле есть КАК?

Это ключевое слово, используемое в сопоставлении с образцом для присвоения имени результату сопоставления с образцом. Например, если вы хотите сопоставить трехэлементный список с шаблоном списка, но вам также нужно имя для всего списка, вы можете написать fun number_in_month (date as [x1, x2, x3]) = .... В этом случае три элемента списка будут известны как x1, x2 и x3 соответственно, а весь список будет известен как date.

Теперь нет причины, по которой вы хотите использовать здесь ключевое слово as. Так получилось, что парсер придумал, потому что fun number_in_month (date as [ может быть началом синтаксически правильной программы, но fun number_in_month (date : [ не может быть.


Итак, ваша фиксированная подпись должна выглядеть так:

number_in_month (date : (int*int*int) list, month : int) : int =

Теперь вы получите кучу ошибок типов в теле функции, связанных с некоторыми пропущенными скобками (например, #2 hd date эквивалентно неверно набранному (#2 hd) date, а не #2 (hd date), что вам и нужно хотите) и тот факт, что number_in_month принимает два аргумента, а не один (другими словами: вы пропускаете аргумент date при рекурсивном вызове number_in_month).

...