结合两个匿名功能

时间:2019-01-25 21:30:05

标签: functional-programming sml

我试图了解如何在SML中结合两个匿名函数。

考虑:

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

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

我想通过组合zx来创建函数y

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

我该如何实现?

1 个答案:

答案 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