【问题标题】:Boolean expressions and functions that take functions as arguments in SML在 SML 中将函数作为参数的布尔表达式和函数
【发布时间】:2021-01-23 07:05:02
【问题描述】:

下面函数 1) 中表达式 'f 7' 的含义我不清楚。除非我使用函数 3),它总是评估为 false,它总是解析为 真的。也就是说,当我传递它时,函数 2) 和函数 2) 应该解析为 false,即当 x 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

【问题讨论】:

  • x 在第二个函数中是7,即(总是)> 0。您需要传递与st 不同的函数,该函数为输入false 返回7,以获得三倍函数。
  • 重命名第二个函数的参数x可能有助于理解,例如到fun st y = y > 0
  • @Bergi 这是有道理的。 “7”很明显。它是一个文字值,而不是任何 int 的占位符。出于某种原因,我一直在思考这些问题......谢谢。
  • 请注意,if x > 0 then true else falsex > 0 是等价的。
  • @Simon Shine 指出 -- 谢谢。

标签: functional-programming sml


【解决方案1】:

除非我使用函数 3),它总是计算为假,否则它总是解析为真。

举个例子:

- 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

~> 是手工还原。

【讨论】:

  • 干得漂亮!非常感谢。我想我需要加强我的 lambda 演算……
猜你喜欢
  • 2012-01-23
  • 2016-02-06
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多