f# - 避免 "Incomplete pattern match"警告的替代方法

标签 f# pattern-matching let-binding

我编写了一个函数,它将一个数组作为输入并返回一个大小相等的数组作为输出。例如:

myFunc [| "apple"; "orange"; "banana" |]
> val it : (string * string) [] =
    [|("red", "sphere"); ("orange", "sphere"); ("yellow", "oblong")|]

现在我想通过 let 绑定(bind)分配结果。例如:

let [|
        ( appleColor, appleShape );
        ( orangeColor, orangeShape );
        ( bananaColor, bananaShape )
    |] = 
    myFunc [| "apple"; "orange"; "banana" |]

效果很好...

> val orangeShape : string = "sphere"
> val orangeColor : string = "orange"
> val bananaShape : string = "oblong"
> val bananaColor : string = "yellow"
> val appleShape : string = "sphere"
> val appleColor : string = "red"

...除非它产生警告:

warning FS0025: Incomplete pattern matches on this expression. For example, the value '[|_; _; _; _|]' may indicate a case not covered by the pattern(s).

警告的来源和原因有already been covered ,我只是在寻找一个简洁的解决方法。这个函数调用发生在我函数的顶部附近,我不喜欢将整个函数体放在匹配项中的想法:

let otherFunc =
    match myFunc [| "apple"; "orange"; "banana" |] with
    | [|
        ( appleColor, appleShape );
        ( orangeColor, orangeShape );
        ( bananaColor, bananaShape )
      |] ->
        // ... the rest of my function logic
    | _ -> failwith "Something impossible just happened!"

那只是闻起来很臭。我也不喜欢忽略警告的想法——这违背了我更好的判断。是否有任何其他选择可供我选择,或者我是否只需要找到一种完全不同的方法?

最佳答案

如果您希望这种调用模式频繁发生,一种可能性是制作作用于您期望的元组大小的包装器,例如

myFunc3 (in1,in2,in3) =
    match myFunc [|in1;in2;in3|] with
    [|out1;out2;out3|] -> out1, out2, out3
    _ -> failwith "Internal error"

等但它所做的只是将丑陋的代码移到一个标准的地方,写出包装器会很不方便。

我不认为这个 API 有任何更好的选择,因为没有办法告诉编译器 myFunc 总是返回与传递的相同数量的元素。

另一种选择可能是将 myFunc 替换为 IDisposable 类:

type MyClass() =
   let expensiveResource = ...


   member this.MyFunc(v) = ...calculate something with v using expensiveResource

   interface IDisposable with
       override this.Dispose() = // cleanup resource

然后像这样在 block 中使用它

use myClass = new MyClass()
let appleColor, appleShape = myClass.MyFunc(apple)
...

关于f# - 避免 "Incomplete pattern match"警告的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443097/

相关文章:

loops - 常见的 Lisp `loop` : maximize into local variable introduced by `let`

f# - F# 中的显式类型递归

asynchronous - HttpClient 的超时在异步 block 内不起作用

sorting - 快速汉明距离计分

java - 排除特殊字符的正则表达式

f# - 如何在 F# 中正确实现属性?

f# - 如何为 F# 类实现结构化 Equals?

f# - 在 F# 中,如何在不重新评估 seq 的情况下获取 seq 的头/尾

java - 增加字符串内的数字