【问题标题】:Can I unpack an F# list with no warnings?我可以在没有警告的情况下解压 F# 列表吗?
【发布时间】:2017-07-25 14:23:40
【问题描述】:

F# 使解包元组变得容易。解包列表也是可行的,但是编译器会发出警告:

let m = [1; 2; 3]
let [a; b; c] = m
// Incomplete pattern matches on this expression. For example, the value '[_;_;_;_]' may indicate a case not covered by the pattern(s)

有没有办法避免这个警告?

【问题讨论】:

    标签: list f# pattern-matching


    【解决方案1】:

    您可以使用#nowarn 指令(在您的情况下为#nowarn "25")禁用每个文件的警告,也可以使用--nowarn 在命令行上禁用警告。

    查看F# Compiler Directives了解详情。

    当第一次禁用警告时,目前无法重新启用警告。

    如果元素的数量无法解包到[a;b;c],您的匹配可能(意外)导致运行时错误,因此您可以使用明确的 risc 完全匹配:

    let m = [1;2;3]
    let (a,b,c) =
        match m with
        | [a;b;c] -> (a,b,c)
        | _ -> failwith "Expected exactly three items in m"
    

    【讨论】:

      【解决方案2】:

      一种明显但并不优雅的方式是:

      let m = [1; 2; 3]
      let a = List.item 0 m
      let b = List.item 1 m
      let c = List.item 2 m
      

      你可以写一个辅助函数让它更整洁:

      let unpack3 x = (List.item 0 x, List.item 1 x, List.item 2 x)
      
      let (a, b, c) = unpack3 m
      

      如果你知道你总是有固定数量的项目,list 基本上不是一个很好的选择。

      【讨论】:

      • 您说得对,列表在这种情况下不太适合。在我的“现实生活”代码中,列表是由 List.map 生成的。有没有更简单的方法将列表转换为元组? Tuple.ofList() 之类的东西?
      • 为什么不“让 myTuple = myList.[0], myList.[1], myList.[2]”?如果这还不够好,也许您正试图以不太好的方式解决问题。
      • @Soldalma - 这不适合类型系统,因为返回类型(例如 2 元组、3 元组...)将取决于列表的内容。
      【解决方案3】:

      如果您的列表 m 有 2 或 4 个元素会怎样?

      显然有一种方法,普通的旧模式匹配:

      let a, b, c =
         match m with
         | [a;b;c] -> a,b,c 
         | _ -> ... // handle the length!=3 case
      

      F# 允许您以这种方式解构右侧的对象,当您清楚地知道您只需要覆盖一个案例时。元组就是这种情况,因为只有一种元组类型可以同时匹配左侧和右侧。像这样的东西显然不会编译,因为类型不匹配:

      let m = 1, 2 
      
      let a, b, c = m
      

      但在您的情况下,不能保证您实际上不在这种情况下:

      let m = [ 1; 2 ]
      
      let [1;2;3] = m
      

      您实际上是在要求编译器允许非详尽的模式匹配。您可以按照其他答案中的说明禁用警告,但这样会引发运行时错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 2011-05-23
        • 1970-01-01
        相关资源
        最近更新 更多