我对SML很新。我目前正在研究一个正在检查移动设备是否平衡的项目。
我的数据类型mobile定义如下:
datatype mobile = Object of int
| Wire of mobile * mobile
然后我有一个重量功能来检查手机的重量:
fun weight (Object w) = w
| weight (Wire (l,r)) = weight l + weight r
我现在正试图检查移动设备是否平衡。我有以下内容:
fun balanced (Object w) = true
| balanced (Wire (l,r)) = if weight l = weight r and balanced l and balanced r then true else false
但是,我一直收到错误:
stdIn:18.19-18.31 Error: syntax error: deleting AND ID
stdIn:18.34 Error: syntax error found at AND
有人可以告诉我我做错了什么吗?
答案 0 :(得分:3)
Brian指出,我们在SML中使用andalso
和orelse
。
但是,如果正确修复了代码,则代码中没有错误。
正如安德烈亚斯罗斯伯格所指出的,当你写一个表格
时if b then
true
else
false
然后你应该立即想到this picture,并将其与表达式b
交换,因为它显然是相同的。
鉴于此,您的balanced
函数最终会看起来像这样
fun balanced (Object w) = true
| balanced (Wire (l,r)) = weight l = weight r andalso
balanced l andalso balanced r
答案 1 :(得分:2)
顺便说一句,这是一种判断是否是移动设备的非常低效的方法 是平衡的,因为子树的权重是一遍又一遍地计算的 再次。想想一个返回的函数weight_of_balanced_mobile 如果移动设备不平衡,则为NONE;如果移动设备是平衡的,则为NONE。
fun weight_of_balanced_mobile (Object w) = SOME w
| weight_of_balanced_mobile (Wire (l,r)) =
case weight_of_balanced_mobile l
of NONE => NONE
| SOME u => case weight_of_balanced_mobile r
of NONE => NONE
| SOME v => if u = v then SOME (u+v) else NONE;
fun is_balanced mobile =
case weight_of_balanced_mobile mobile
of NONE => false
| SOME _ => true;
这里的问题是你的'平衡'函数只返回一位 信息,而为了有效地计算,我们需要更多的信息。一世 已经把布尔视为危险信号。
构建计算的另一种方法,以便您获得更多信息 (不仅仅是 平衡,但它有多重)是通过 延续。我们将创建一个移动和'什么的功能 如果这个手机是平衡的“论据”。哦,让我们来吧 '如果不是那么值使用的价值。
(* val check_balance : mobile -> 'a -> (int -> 'a) -> 'a *)
fun check_balance (Object w) _ f = f w
| check_balance (Wire (l,r)) d f =
check_balance l d (fn u =>
check_balance r d (fn v =>
if u = v then f (u+v) else d));
fun is_balanced mobile = check_balance mobile false (fn _ => true);
如果你恰到好处地看,它与前面的代码相同 从内到外。
答案 2 :(得分:1)
将and
更改为andalso
会超出syntax error found at AND
错误。
- fun balanced (Object w) =
true | balanced(Wire(l,r)) =
if weight l = weight r andalso balanced l andalso r
then
true
else
false;
但是你得到了这个:
stdIn:5.8-5.29 Error: operand of andalso is not of type bool [tycon mismatch]
operand: mobile
in expression:
(balanced l) andalso r
这是因为weight
函数的类型是val weight = fn : mobile -> int
,它不满足andalso
的布尔约束,因为它返回int
。