Если вы хотите определить функцию, которая объединяет две функции таким образом, что вторая функция оценивается, когда первая функция не может предоставить значение для нее, вам придется обработать исключение Match
, которое возникает, когдапервая функция дает сбой:
val x = fn 5 => 5
| 6 => 6;
val y = fn 3 => 3
| 2 => 2;
val z = fn i => x i
handle Match => y i;
Это несколько уродливо, поскольку, возможно, handle
на самом деле не в духе функционального программирования, но оно решает проблему.Более чистым решением было бы z
вернуть int option
, но это изменило бы тип возврата ваших функций.Результат может выглядеть следующим образом:
val x = fn 5 => SOME 5
| 6 => SOME 6
| _ => NONE
val y = fn 3 => SOME 3
| 2 => SOME 2
| _ => NONE
val z = fn i => case x i of
SOME j => SOME j
| NONE => y i;
Этот результат был преимуществом глушения всех предупреждений компилятора, но вам нужно было бы использовать сопоставление с образцом (как это делает z
) в любой вызывающей функции для интерпретации выходных данных,Обратите внимание, что сопоставление с образцом может извлечь значение.В этом случае z
просто перенаправил SOME j
, но он мог бы использовать целочисленное значение j
напрямую, если бы это было необходимо.См. этот вопрос для получения дополнительной информации о параметрах.