0

我正在参加 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
4

2 回答 2

1

你不能if ... then ...没有一个else ...案例。

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

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

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

此外,如果你得到一个if-then-else, 其中thenorelse部分是trueor 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
于 2013-01-30T21:15:52.140 回答
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
于 2013-01-30T21:15:16.263 回答