1
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 比较陌生,所以不太了解通用语言和语法。我做错了什么?

4

2 回答 2

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
于 2012-04-06T13:28:46.963 回答
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

使用 case 是因为我们可以在原始函数中进行一些模式匹配,然后将其直接转换为 case,这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
于 2012-04-06T17:36:37.863 回答