结合两个匿名函数
Combining two anonymous functions
我正在尝试了解如何在 SML
中组合两个匿名函数。
考虑:
val x = fn 5 => 5
| 6 => 6;
val y = fn 3 => 3
| 2 => 2;
我想通过组合 x
和 y
来创建函数 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。
我正在尝试了解如何在 SML
中组合两个匿名函数。
考虑:
val x = fn 5 => 5
| 6 => 6;
val y = fn 3 => 3
| 2 => 2;
我想通过组合 x
和 y
来创建函数 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。