我正在参加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
答案 0 :(得分:1)
如果没有if ... then ...
案例,您就不能拥有else ...
。
您尝试在此处执行此操作:
|x::y::[] => if card_color (x) = card_color (y) then true
请记住,if ... then ... else ...
是一个表达式,因此无论条件是真还是假,都需要一个值。
此外,如果您获得if-then-else
,其中then
或else
部分直接为true
或false
,您可以写更多内容简洁。例如,
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