为什么这个真/假蕴涵功能在SML中不起作用?

时间:2012-04-06 13:16:48

标签: functional-programming sml high-level

val implies =
    fn x y = case x of false andalso case y of false => true
     | fn x y = case x of false andalso case y of true => true
     | fn x y = case x of true andalso case y of false => false
     | fn x y = case x of true andalso case y of true => true;  

我无法编译。我对SML比较陌生,所以不太习惯一般的语言和语法。我做错了什么?

2 个答案:

答案 0 :(得分:7)

有各种各样的错误:

  • implies中没有任何参数可以直接进行模式匹配。
  • case x of用于与特定值进行模式匹配,而不是像接受布尔表达式的if/else表达式。
  • lambda的语法应以fn x => ...开头。

快速修复:

fun implies x y =
    case (x, y) of
      (false, false) => true
    | (false, true) => true
    | (true, false) => false
    | (true, true) => true

可以重写为可读性:

fun implies false false = true
  | implies false true = true
  | implies true false = false
  | implies true true = true
使用命题逻辑规则

或更简洁:

fun implies x y = (not x) orelse y

答案 1 :(得分:4)

关于匿名函数,

fun implies x y = (not x) orelse y

可以写成

val implies = fn x => fn y => (not x) orelse y

然而如你所见,以这种方式这样做是没有任何意义的(在这种特殊情况下)。

SML中的匿名函数只接受一个参数。由于fun关键字是

的语法糖(也称为派生形式),所以参数的干扰起作用
val rec implies = fn x => fn y =>
    case (x, y) of
      (x,y) => (not x) orelse y

使用该案例是因为我们可以在原始函数中进行一些模式匹配,然后直接将其转换为案例,而rec是因为原始函数可能是递归的。

因此,@ pad给出的第二个例子相当于:

val rec implies = fn x => fn y =>
    case (x, y) of
       (false, false) => true
     | (false, true) => true
     | (true, false) => false
     | (true, true) => true