Functional programming 为什么不是';这个真/假蕴涵函数在SML中不起作用吗?

Functional programming 为什么不是';这个真/假蕴涵函数在SML中不起作用吗?,functional-programming,sml,high-level,Functional Programming,Sml,High Level,我无法编译这个。我对SML比较陌生,所以不太了解通用语言和语法。我做错了什么?有各种各样的错误: 中没有参数意味着直接进行模式匹配 的案例x用于与特定值的模式匹配,而不像接受布尔表达式的if/else表达式 lambda的语法应该以fn x=>…开头 快速修复: val implies = fn x y = case x of false andalso case y of false => true | fn x y = case x of false andals

我无法编译这个。我对SML比较陌生,所以不太了解通用语言和语法。我做错了什么?

有各种各样的错误:

  • 中没有参数意味着直接进行模式匹配
  • 的案例x用于与特定值的模式匹配,而不像接受布尔表达式的
    if/else
    表达式
  • lambda的语法应该以
    fn x=>…
    开头
快速修复:

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;  
为了便于阅读,可将其改写为:

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

有各种各样的错误:

  • 中没有参数意味着直接进行模式匹配
  • 的案例x用于与特定值的模式匹配,而不像接受布尔表达式的
    if/else
    表达式
  • lambda的语法应该以
    fn x=>…
    开头
快速修复:

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;  
为了便于阅读,可将其改写为:

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
可以写成

fun implies x y = (not x) orelse y
然而,正如您所看到的,这样做(在这种特殊情况下)并没有任何意义

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

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

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

val rec implies = fn x => fn y =>
    case (x, y) of
      (x,y) => (not x) orelse y

关于匿名功能

fun implies x y = (not x) orelse y
可以写成

fun implies x y = (not x) orelse y
然而,正如您所看到的,这样做(在这种特殊情况下)并没有任何意义

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

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

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

val rec implies = fn x => fn y =>
    case (x, y) of
      (x,y) => (not x) orelse y

尝试了第一个建议,但没有编译。获取此错误:tut01.sml:20.1错误:语法错误:将BAR替换为未捕获的野生异常Compile[Compile:“syntax error”]引发于:../compiler/Parse/main/smlfile.sml:15.24-15.46../compiler/TopLevel/interact/evalloop.sml:44.55../compiler/TopLevel/interact/evalloop.sml:296.17-296.20,删除第一个栏(请参阅我的更新),因为它是多余的。请参阅我的更新,请记住,第一个方法是最糟糕的方法。@pad,我认为您使用匿名函数/lambda有点太快了?希望你是指
fn(x,y)=>…
fn x=>fn y=>…
@Jesper.Reenberg:谢谢,我修正了打字错误。尝试了第一个建议,它没有编译。获取此错误:tut01.sml:20.1错误:语法错误:将BAR替换为未捕获的野生异常Compile[Compile:“syntax error”]引发于:../compiler/Parse/main/smlfile.sml:15.24-15.46../compiler/TopLevel/interact/evalloop.sml:44.55../compiler/TopLevel/interact/evalloop.sml:296.17-296.20,删除第一个栏(请参阅我的更新),因为它是多余的。请参阅我的更新,请记住,第一个方法是最糟糕的方法。@pad,我认为您使用匿名函数/lambda有点太快了?希望你的意思是
fn(x,y)=>…
fnx=>fny=>…
@Jesper.Reenberg:谢谢,我修正了打字错误。