结合两个匿名函数

Combining two anonymous functions

我正在尝试了解如何在 SML 中组合两个匿名函数。

考虑:

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

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

我想通过组合 xy 来创建函数 z:

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

如何实现?

如果您想定义一个组合两个函数的函数,以便在第一个函数无法为其提供值时对第二个函数求值,则必须处理 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 return 和 int option,但这会改变函数的 return 类型。结果可能如下所示:

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。有关选项的更多信息,请参阅 this question