SML 中将函数作为参数的布尔表达式和函数
Boolean expressions and functions that take functions as arguments in SML
表达式'f 7'在函数中的含义1) 我不清楚下面的内容。除非我使用函数 3),它的计算结果总是 false,它总是解析为 true。也就是说,当我传递函数 2) 和函数 2) 应该解析为 false,即当 x <=0 时,else 分支——在这种情况下表达式 fn x => 3x*--执行失败。我想我可能缺少一些明显的东西......任何提示都将不胜感激。
1)
fun double_or_triple f =
if f 7
then fn x => 2*x
else fn x => 3*x
fun st x = if x > 0 then true else false
fun always_false (x:int) = false;
附录:
将@Simon Shine 的方法与函数 2) 一起使用可以清楚地知道发生了什么:
double_or_triple st 6
-> (if st 7 then fn x => 2 * x else fn x => 3 * x) 6
-> (if (if (7 > 0) then true else false) then fn x => 2 * x else fn x => 3 * x) 6
-> (if (if true then true else false) then fn x => 2 * x else fn x => 3 * x) 6
-> (if true then fn x => 2 * x else fn x => 3 * x) 6
-> (fn x => 2 * x) 6
-> 2*6
-> 12
Unless I use function 3), which always evaluates to false, it always resolves to true.
举个例子:
- fun is_even x = (x mod 2 = 0);
- double_or_triple is_even 2;
> val it = 6 : int
为了清楚起见,您可以手动评估这些内容:
double_or_triple is_even 2
~> (if is_even 7 then fn x => 2*x else fn x => 3*x) 2
~> (if (7 mod 2 = 0) then fn x => 2*x else fn x => 3*x) 2
~> (if (1 = 0) then fn x => 2*x else fn x => 3*x) 2
~> (if false then fn x => 2*x else fn x => 3*x) 2
~> (fn x => 3*x) 2
~> 3*2
~> 6
其中 ~>
减少了 hand-made。
表达式'f 7'在函数中的含义1) 我不清楚下面的内容。除非我使用函数 3),它的计算结果总是 false,它总是解析为 true。也就是说,当我传递函数 2) 和函数 2) 应该解析为 false,即当 x <=0 时,else 分支——在这种情况下表达式 fn x => 3x*--执行失败。我想我可能缺少一些明显的东西......任何提示都将不胜感激。
1)
fun double_or_triple f =
if f 7
then fn x => 2*x
else fn x => 3*x
fun st x = if x > 0 then true else false
fun always_false (x:int) = false;
附录: 将@Simon Shine 的方法与函数 2) 一起使用可以清楚地知道发生了什么:
double_or_triple st 6
-> (if st 7 then fn x => 2 * x else fn x => 3 * x) 6
-> (if (if (7 > 0) then true else false) then fn x => 2 * x else fn x => 3 * x) 6
-> (if (if true then true else false) then fn x => 2 * x else fn x => 3 * x) 6
-> (if true then fn x => 2 * x else fn x => 3 * x) 6
-> (fn x => 2 * x) 6
-> 2*6
-> 12
Unless I use function 3), which always evaluates to false, it always resolves to true.
举个例子:
- fun is_even x = (x mod 2 = 0);
- double_or_triple is_even 2;
> val it = 6 : int
为了清楚起见,您可以手动评估这些内容:
double_or_triple is_even 2
~> (if is_even 7 then fn x => 2*x else fn x => 3*x) 2
~> (if (7 mod 2 = 0) then fn x => 2*x else fn x => 3*x) 2
~> (if (1 = 0) then fn x => 2*x else fn x => 3*x) 2
~> (if false then fn x => 2*x else fn x => 3*x) 2
~> (fn x => 3*x) 2
~> 3*2
~> 6
其中 ~>
减少了 hand-made。