我得到错误:语法错误:在编译我的SML代码时插入ELSE ID,我不知道为什么

时间:2013-01-30 21:09:32

标签: sml

我正在参加Coursera课程,我正在尝试做家庭作业。

我们必须编写一个SML程序,其中包含一系列卡片(以其套装和等级为特征),如果它们都具有相同的颜色则返回true,否则返回false。

这是我的代码(我无法理解为什么它的错误,但我在编程中退出了一个菜鸟):

datatype suit = Clubs | Diamonds | Hearts | Spades
datatype rank = Jack | Queen | King | Ace | Num of int 
type card = suit * rank

datatype color = Red | Black
datatype move = Discard of card | Draw 


fun card_color (c) = case c of
(Hearts,_) => Red
|(Diamonds,_)  => Red
|(_,_) => Black


fun all_same_color (cs) = case cs of
    [] => false
    |x::[] => true 
|x::y::[] =>  if card_color (x) = card_color (y) then true
|x::y::xs => if card_color(x)=card_color(y) then all_same_color(xs)
                        else false

2 个答案:

答案 0 :(得分:1)

如果没有if ... then ...案例,您就不能拥有else ...

您尝试在此处执行此操作:

|x::y::[] =>  if card_color (x) = card_color (y) then true

请记住,if ... then ... else ...是一个表达式,因此无论条件是真还是假,都需要一个值。

此外,如果您获得if-then-else,其中thenelse部分直接为truefalse,您可以写更多内容简洁。例如,

if card_color(x)=card_color(y) then all_same_color(xs) else false

与说

相同
card_color x = card_color y andalso all_same_color xs

答案 1 :(得分:0)

我不知道那种语言,但你的最后一个条件是不正确的(我假设是某种Haskell):

|x::y::xs => if card_color(x)=card_color(y) then all_same_color(xs)
                    else false

应该是:

|x::y::xs => if card_color(x)=card_color(y) then all_same_color(y::xs)
                    else false

我不知道(y :: xs)是否是我的意思,该参数应该是一个带有y后跟xs的列表。使用该条件,您的第三种情况是多余的,因此最后一个函数应该是:

fun all_same_color (cs) = case cs of
    [] => false
    |x::[] => true 
    |x::y::xs => if card_color(x)=card_color(y) then all_same_color(y::xs)
                    else false