Как говорит Джон Колман, SML / NJ не будет выдавать очень полезные сообщения об ошибках. Вместо этого вы можете попробовать установить Moscow ML , поскольку это дает лучшие сообщения об ошибках. К сожалению, с этим кодом на синтаксическом уровне есть некоторые проблемы, которые мешают компилятору выдавать значимую ошибку. Вот несколько советов по правильному синтаксису, чтобы вы могли сосредоточиться на проблемах алгоритма:
- Не используйте
local
, используйте let
.
- Соответствует каждому
(
с )
; у вас слишком много )
с.
- Объявите
fun loop ... = ...
внутри let
и in
.
Как только вы это сделаете, шаблон для функции, решающей вашу проблему, может выглядеть следующим образом:
fun smallest_subarray (needles : Array.array, haystack : Array.array) =
let
val ... = ...
fun loop ... = ...
in
if Array.length needles > Array.length haystack
then ...
else loop ...
end
Что, если нет решения проблемы, что вернет функция? ~1
? NONE
Если вы пытаетесь преобразовать программу на C ++ в SML, попробуйте включить функциональную часть таким образом, чтобы было очевидно, какие идентификаторы являются аргументами функции, и попытайтесь назвать их логически; Я понятия не имею, что такое cordela
, e
и k
, или если N
является функцией размера входного массива или константой.
Поскольку идиоматическое решение в SML использует рекурсию (вызывающую функцию), а не итерацию (while
), вы имеете дело как с нетривиальной проблемой алгоритма , так и с другой парадигмой. Вместо этого попробуйте решить аналогичную, но более простую проблему, где алгоритм более тривиален, и примените парадигму рекурсии.
Например, попробуйте написать функцию, которая находит позицию элемента в отсортированном массиве с помощью бинарного поиска:
fun find x arr =
let
fun loop ... = ...
in
loop ...
end
Функция loop
принимает границы поиска (например, i
и j
) в качестве аргумента и возвращает либо SOME i
, если x
найден в позиции i
, либо NONE
. Вы могли бы расширить эту проблему в направлении исходной проблемы, пытаясь написать функцию, которая определяет, встречается ли входной массив needles
в другом входном массиве haystack
в порядке, указанном в needles
. Сначала вы можете предположить, что needles
и haystack
отсортированы, а затем предположить, что это не так.