【发布时间】:2011-05-09 15:07:08
【问题描述】:
我需要在我的一个函数中检测交换模式。我认为编写以下内容可以完成工作:
let my_fun a b = match a,b with
(*...*)
| a,b
| b,a when is_valid b -> process b (***)
(*...*)
这不起作用,Ocaml 抱怨 此子模式未使用
对标有(***) 的行发出警告。
1) 有人可以向我解释这个警告试图表达什么以及为什么这不起作用吗?
2) 考虑到我现在想知道哪个参数is_valid,我如何才能在不使用if then else 的情况下优雅地写这个?
2) 是否有可能只使用模式匹配而不重复 when is_valid b -> process b 来获得预期的功能,就像下面发生的那样?
let my_fun a b = match a,b with
(*...*)
| a,b when is_valid b -> process b
| b,a when is_valid b -> process b
(*...*)
编辑:
在我的具体示例中,a 和 b 是成对的。该函数有点复杂,但下面将说明情况:
let f a b = match a,b with
| (a1,a2),(b1,b2)
| (b1,b2),(a1,a2) when b1 = b2 -> a1 + a2
调用f (1,1) (1,2) 将导致模式匹配失败。我知道为什么(感谢下面的答案),并且我知道如果每个元素都有不同的构造函数(如 Ashish Agarwal 的回答),我如何使它工作。你能建议一种方法让它适用于我的情况吗?
【问题讨论】:
标签: warnings pattern-matching ocaml