get_nth
уже производит option
, поэтому нет необходимости заключать его в другой «дополнительный слой» с SOME
.
Кроме того, приложение функции связывается очень плотно - как говорит SML, на самом деле у вас есть эквивалент (SOME get_nth) (xs, n-1)
, что означает, что SOME get_nth
будет функцией.
(Если бы добавление SOME
было правильным, это было бы SOME (get_nth(xs, n-1))
.)
Возникла вторая ошибка потому что ваше сопоставление с образцом также неверно, вы не можете иметь список ([]
) в одном случае и пару в другом.
С этими двумя исправлениями вы получите
fun get_nth e =
case e of
([], _) => NONE
| (x::xs, n) => if n = 1
then SOME x
else get_nth(xs, n-1)
но чаще определить функцию с несколькими предложениями шаблона, чем использовать case
:
fun get_nth ([], _) = NONE
| get_nth (x::xs, n) = if n = 1
then SOME x
else get_nth(xs, n-1)