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比较陌生,所以不太习惯一般的语言和语法。我做错了什么?
答案 0 :(得分:7)
有各种各样的错误:
implies
中没有任何参数可以直接进行模式匹配。case x of
用于与特定值进行模式匹配,而不是像接受布尔表达式的if/else
表达式。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