0

私はCourseraのクラスに参加していて、宿題をしようとしています。

カードのリスト(スーツとランクによって特徴付けられる)を取り、それらがすべて同じ色である場合はtrueを返し、そうでない場合はfalseを返すSMLプログラムを作成する必要があります。

これが私のコードです(なぜそれが間違っているのか理解できませんが、プログラミングの初心者をやめています):

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 ...は式であるため、条件がtrueかfalseかに関係なく、値が必要であることを忘れないでください。

さらに、またはif-then-elseのいずれかのthen部分elsetrueまたは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が続くリストである必要があります。その条件を使用すると、3番目のケースは冗長になるため、最後の関数は次のようになります。

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 に答える