gpt4 book ai didi

warnings - 如何使用模式匹配检测 Ocaml 中的交换模式?

转载 作者:行者123 更新时间:2023-12-04 10:57:08 24 4
gpt4 key购买 nike

我需要在我的一个函数中检测一个交换模式。我认为编写以下内容可以完成工作:

let my_fun a b = match a,b with
(*...*)
| a,b
| b,a when is_valid b -> process b (***)
(*...*)

这不起作用,Ocaml 提示此子模式未使用
对标有 (***) 的行发出警告.

1)有人可以向我解释这个警告试图说什么以及为什么这不起作用?

2) 如果不使用 if then else,我怎样才能真正优雅地写出来?鉴于我现在想知道哪个参数 is_valid ?

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
(*...*)

编辑:

在我的具体例子中 ab是对。该函数有点复杂,但下面将说明这种情况:
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 的回答),我如何使它工作。你能建议一种让它在我的情况下工作的方法吗?

最佳答案

匹配的工作原理是首先匹配模式,如果成功,则通过该模式匹配中的附加环境评估条件。由于a,b将始终绑定(bind),这是唯一使用的情况,编译器正确报告 b,a从未使用过。你必须重复那句话,

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

如果您没有对变量执行匹配,而是对某些变体执行匹配,您的方法可能会起作用,例如,
let my_fun a b = match a,b with
| a, `Int b
| `Int b, a when is_valid b -> process b

编辑:考虑使用一个守卫作为子表达式的多种模式,
let my_fun a b = match a,b with
| ((a,b) | (b,a)) when is_valid b -> process b

您将在 patterns 的定义中看到这一点。 .它实际上是一个模式,由模式组成,被匹配。

关于warnings - 如何使用模式匹配检测 Ocaml 中的交换模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5938798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com