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
Я бы не рекомендовал использовать это.