Function 编写一个用于在SML中比较扑克牌的函数

Function 编写一个用于在SML中比较扑克牌的函数,function,sml,smlnj,Function,Sml,Smlnj,我已经创建了一个数据结构,用于从标准牌组(52张牌,没有小丑)中表示扑克牌(不确定是否正确)。每张牌上有一套黑桃、红桃、钻石或梅花,还有一套王牌、2、3、4、5、6、7、8、9、10、杰克、皇后、国王: datatype suit = spades | hearts | diamonds | clubs datatype rank = ace | king | queen | jack | ten | nine | eight | seven | six | five | four | thre

我已经创建了一个数据结构,用于从标准牌组(52张牌,没有小丑)中表示扑克牌(不确定是否正确)。每张牌上有一套黑桃、红桃、钻石或梅花,还有一套王牌、2、3、4、5、6、7、8、9、10、杰克、皇后、国王:

datatype suit = spades | hearts | diamonds | clubs
datatype rank = ace | king | queen | jack | ten | nine | eight | seven | six | five | four | three | two
type playing_card = suit * rank
下一步是编写一个函数
greaterCard
,该函数对我刚才声明的新数据类型进行操作。函数应该以两张扑克牌作为参数。如果第一张卡的值高于第二张卡的值,则函数应返回
true
,否则返回
false
。王牌被认为是最高等级,其次是国王、王后、杰克、10、9、…、2。如果两张牌的等级相同,则套装顺序如下:黑桃>红桃>梅花>钻石

首先,我创建了两个子函数,这样每个等级和套装都会得到一个整数形式的值,以便稍后我可以比较这些整数,看看一张牌是否大于另一张牌:

fun value_of_rank rank =                                      
case rank of
   ace => 14
 | king => 13
 | queen => 12
 | jack => 11
 | ten  => 10
 | nine => 9
 ...
 | two => 2 
以及:


我如何从这里开始,有没有更好的方法

卡片比较需要两个阶段:

fun compare_cards(c1,c2)
  let val val_c1 = value_of_rank(c1)
      val val_c2 = value_of_rank(c2)
  in 
      if val_c1 = val_c2
      then compare_on_suit
      else compare_on_rank
  end

此外,等级的
值将更优雅,案例更少。考虑哪些情况可以组合。

你是否建议使用编号为<代码> num的代码?如果是这样,这将增加出错的机会。问题变量是离散的,最好是这样表示。
fun compare_cards(c1,c2)
  let val val_c1 = value_of_rank(c1)
      val val_c2 = value_of_rank(c2)
  in 
      if val_c1 = val_c2
      then compare_on_suit
      else compare_on_rank
  end