初学者SML语法

时间:2013-01-16 18:49:33

标签: syntax sml

我对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

有人可以告诉我我做错了什么吗?

3 个答案:

答案 0 :(得分:3)

Brian指出,我们在SML中使用andalsoorelse

但是,如果正确修复了代码,则代码中没有错误。

正如安德烈亚斯罗斯伯格所指出的,当你写一个表格

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