ML реальный список вернуть реальное число

В настоящее время я работаю над небольшим проектом ML и учусь работать с ним, но вот некоторые проблемы, с которыми я сталкиваюсь, но я не могу найти какой-либо источник в Интернете.

Я хочу иметь функцию для возврата последнего номера в списке, который является списком действительных чисел. Я написал код, возвращающий реальный список из одного элемента, но я сделаю так, чтобы он был действительным числом, а не списком. вот мой код:

fun last [] = nil
  | last(head::nil) = [head]
  | last(head::list) = last(list)

я думал

last(head::nil)=head

поможет получить реальное число, но это просто даст мне ошибку, которая:

operator domain: 'Z list list
operand:         real list

Спасибо!

1 ответ

Как говорит мельпомена, nil не является значением типа real, поэтому он не может быть типом возврата для пустого списка. Фактически, никакое значение не может быть возвращено, потому что список пуст! Это делает функцию last частично. Вы хотите избежать частичных функций, потому что они могут аварийно завершить работу во время выполнения. Вы можете определить альтернативную функцию, lastOpt:

fun lastOpt [] = NONE
  | lastOpt [x] = SOME x
  | lastOpt (_::xs) = lastOpt xs

Например,

- lastOpt [1,2,3];
> val it = SOME 3 : int option
- lastOpt [];
> val it = NONE : 'a option

Это передает ответственность за обработку пустых списков явно вызывающей стороне lastOpt,

Встроенная функция List.last был сделан небезопасным с исключениями:

fun last [] = raise Empty
  | last [x] = x
  | last (_::xs) = last xs

Я бы не рекомендовал использовать это.

Другие вопросы по тегам