【问题标题】:F# matching with two valuesF# 匹配两个值
【发布时间】:2009-01-26 18:08:41
【问题描述】:

我是 F# 的新手,我想用 (match ... with ...) 语法比较两个值

当我尝试像这样比较两个值时会出现问题:

let value1 = 19
let isValue1 y =
    match y with
    | value1 -> y + 1
    | _ -> y

我收到一条警告说永远无法到达代码的“| _ -> y”部分。这是为什么呢?

我知道我可以执行以下操作来让函数按我想要的方式工作:

let value1 = 19
let isValue1 y =
    match y with
    | _ when y = value1 -> true
    | _ -> false

这个也可以

let value1 = 19
let isValue1 y =
    match y with
    | 19 -> true
    | _ -> false

我只是好奇为什么我不能这样做,以及 match 的实际工作原理。

【问题讨论】:

    标签: f# pattern-matching


    【解决方案1】:

    match 语句中的 value1 被定义为一个新变量,其值设置为 y(作为匹配项)。上面定义的 value1 将被忽略,就像您在 C# 函数中声明一个与类变量同名的局部变量一样。出于这个原因,第一个匹配条件将匹配所有内容,而不仅仅是先前定义的 value1 值,因此会出现错误。希望澄清问题。

    【讨论】:

      【解决方案2】:

      模式匹配既是一个控制结构(接下来执行什么代码),也是一个绑定结构(如“let”,将名称绑定到值)。所以当你这样做时

      match expr with
      | name -> ...
      

      模式(“名称”)始终匹配,并且标识符“名称”只是绑定到表达式的值。这就是为什么模式匹配主要用于区分联合(案例类型),您可以根据结构进行匹配。例如

      match someOption with
      | Some(x) -> ... // binds x
      | None -> ...
      
      match someList with
      | h :: t -> ... // binds h and t to head/tail
      | [] -> ...
      

      【讨论】:

        【解决方案3】:

        您可以将输入与[<Literal>] 属性标记的文字/标识符匹配,而无需绑定它。

        例如:

        #light
        [<Literal>]
        let E  = 2.718281828459
        
        
        let isE x =
            match x with
            | E -> true
            | _ -> false
        
        print_any (isE 3.2)
        print_any (isE E)
        

        根据Crish Smith

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-08
          • 1970-01-01
          • 2013-11-22
          相关资源
          最近更新 更多