我试图了解如何在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;
我该如何实现?
答案 0 :(得分:4)
如果您要定义一个组合两个函数的函数,以便在第一个函数无法为其提供值时对第二个函数进行评估,则必须处理BEGIN;
SELECT number FROM tbl LIMIT 1 FOR UPDATE;
DELETE FROM tbl WHERE number = << the value from the SELECT >>
COMMIT;
异常,即在第一个函数失败时引发:
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
。有关选项的更多信息,请参见this question。