我编写了一个函数,它将一个数组作为输入并返回一个大小相等的数组作为输出。例如:
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/