Объединение двух анонимных функций - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь понять, как объединить две анонимные функции в SML.

Рассмотрим:

val x = fn 5 => 5
        |  6 => 6;

val y = fn 3 => 3
        |  2 => 2;

Я хотел бы создать функцию z, комбинируя x и y:

val z = fn 5 => 5
        |  6 => 6
        |  3 => 3
        |  2 => 2;

Как мне этого добиться?

1 Ответ

0 голосов
/ 26 января 2019

Если вы хотите определить функцию, которая объединяет две функции таким образом, что вторая функция оценивается, когда первая функция не может предоставить значение для нее, вам придется обработать исключение 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 напрямую, если бы это было необходимо.См. этот вопрос для получения дополнительной информации о параметрах.

...