【问题标题】:How can I make this match expression more concise?如何使这个匹配表达式更简洁?
【发布时间】:2014-02-21 14:25:16
【问题描述】:

通过编写二十一点来学习 F#。我有这些类型:

type Suit = 
| Heart = 0
| Spade = 1
| Diamond = 2
| Club = 3

type Card =
| Ace of Suit
| King of Suit
| Queen of Suit
| Jack of Suit
| ValueCard of int * Suit

我有这个功能(暂时忽略 ace 可以有 2 个不同的值):

let NumericValue =
  function | Ace(Suit.Heart) | Ace(Suit.Spade) | Ace(Suit.Diamond) | Ace(Suit.Club) -> 11
         | King(Suit.Heart) | King(Suit.Spade)| King(Suit.Diamond) | King(Suit.Club) | Queen(Suit.Heart) | Queen(Suit.Spade)| Queen(Suit.Diamond) | Queen(Suit.Club) | Jack(Suit.Heart) | Jack(Suit.Spade)| Jack(Suit.Diamond) | Jack(Suit.Club) -> 10
         | ValueCard(num, x) -> num

有没有办法可以包含范围或其他内容?就像 [Ace(Suit.Heart) .. Ace(Suit.Club)]。甚至更好的 Ace(*)

【问题讨论】:

    标签: f#


    【解决方案1】:

    你想要一个通配符模式。规范(§7.4)说:

    模式 _ 是一个通配符模式并且匹配任何输入。

    let numericValue = function 
    | Ace _-> 11
    | King _
    | Queen _
    | Jack _ -> 10
    | ValueCard(num, _) -> num
    

    【讨论】:

    • 我希望。编译器告诉我 Ace 是一个构造函数;它不能单独使用。
    • @dudeNumber4 你确定你把通配符放在 Ace 后面吗?
    • @MatthewMcveigh,废话,这就是我一直想念的东西!
    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 2021-12-14
    • 2012-11-15
    • 2012-07-20
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多