Сопоставление с образцом происходит от самого верхнего предложения до самого нижнего, поэтому вы хотите, чтобы самый общий случай был последним.
fun monthI2S 1 = "January"
| monthI2S 2 = "February"
...
| monthI2S m = nothing else matched, so m must be < 1 or > 12...
Теперь, как вы справитесь с ошибкой, зависит от вас.
Тривиальное и наименее надежное решение - просто вернуть "Неверный номер месяца" или что-то в этом роде.
Вы также можете вызвать исключение или использовать Option
.
Если вы используете последнее, я бы лично переписал с локальной функцией, чтобы избежать разбрасывания SOME
повсюду:
fun monthI2S m = let
fun monthI2S_safe 1 = "January"
| monthI2S_safe 2 = "February"
| monthI2S_safe 3 = "March"
| monthI2S_safe 4 = "April"
| monthI2S_safe 5 = "May"
| monthI2S_safe 6 = "June"
| monthI2S_safe 7 = "July"
| monthI2S_safe 8 = "August"
| monthI2S_safe 9 = "September"
| monthI2S_safe 10 = "October"
| monthI2S_safe 11 = "November"
| monthI2S_safe 12 = "December"
| monthI2S_safe _ = "Can never happen"
in
if m >= 1 andalso m <= 12 then SOME (monthI2S_safe m) else NONE
end;