Functional programming SML和函数式编程新手。初学者问题

Functional programming SML和函数式编程新手。初学者问题,functional-programming,sml,Functional Programming,Sml,我试图将逻辑运算exclusive or定义为一个两变量函数。我不能使用常量、类型注释或if-then-else。我相信我应该通过使用逻辑运算符来实现这一点,但我不知道我应该如何使用这些运算符写出一个函数!到目前为止我有 fun xor(a,b) = a orelse b andalso not(a andalso b). 我应该如何从这一点返回一个真值?首先,您不需要记住和的相对优先级和关联性,并且和或我会使用更多参数: fun xor(a,b) = (a orelse b) andalso

我试图将逻辑运算exclusive or定义为一个两变量函数。我不能使用常量、类型注释或if-then-else。我相信我应该通过使用逻辑运算符来实现这一点,但我不知道我应该如何使用这些运算符写出一个函数!到目前为止我有

fun xor(a,b) = a orelse b andalso not(a andalso b).

我应该如何从这一点返回一个真值?

首先,您不需要记住
的相对优先级和关联性,并且
我会使用更多参数:

fun xor(a,b) = (a orelse b) andalso not(a andalso b);
- map xor [(true, true), (true, false), (false, true), (false, false)];
val it = [false,true,true,false] : bool list
您的错误是您的表达式关联如下

a orelse (b andalso not(a andalso b));
sml中没有“返回”的概念。只有计算为值的表达式,这些值依次用于其他表达式中

(a orelse b) andalso not(a andalso b)
计算为类型为
bool
的值。您可以在进一步计算中使用该结果:

if xor(foo, bor) then 1 else 2

此外,这可以实现得更短:
funxor(a,b)=ab
。此函数的类型是
''a*'>a->bool
-如果您希望它是
bool*bool->bool
,则必须添加一个类型约束,这有点笨拙,但有效:
有趣的异或(a:bool,b)=a b