gpt4 book ai didi

performance - 在 OCaml 模式匹配中哪个更好, `when` 或 `if-then-else` ?

转载 作者:行者123 更新时间:2023-12-05 01:08:07 25 4
gpt4 key购买 nike

假设我们有一个名为 d 的类型:

type d = D of int * int

我们想对它做一些模式匹配,这样做更好吗:

let dcmp = function 
| D (x, y) when x > y -> 1
| D (x, y) when x < y -> -1
| _ -> 0

let dcmp = function 
| D (x, y) ->
if x > y then 1 else if x < y then -1 else 0

一般来说,匹配具有许多“何时”情况的模式或匹配一个模式并在其中放入“if-then-else”更好?

我在哪里可以获得有关此类问题的更多信息,例如 OCaml 和语法糖的良好实践等?

最佳答案

这两种方法各有优缺点,因此应根据具体情况使用它们。

when 子句比 if 更容易理解,因为它只有一个分支,所以你可以一次消化一个分支。它的代价是,当我们分析一个子句以了解其路径条件时,我们必须分析它之前的所有分支(并否定它们),例如,将您的变体与以下等效定义进行比较,

  let dcmp = function 
| D (x, y) when x > y -> 1
| D (x, y) when x = y -> 0
| _ -> -1

当然,对于 if/then/else 构造也是如此,只是更难在 if/then/else 表达式中意外地重新排列分支(例如,在重构期间)并彻底改变表达式的逻辑。

此外,when 守卫可能会阻止编译器执行决策树优化1并混淆2反驳机制。

鉴于此,在此特定示例中使用 when 而不是 if 的唯一优势是 when 语法看起来更有吸引力,因为它完美排列,并且人脑更容易找到条件及其对应值的位置,即,它看起来更像一个真值表。但是,如果我们写

let dcmp (D (x,y)) = 
if x = y then 0 else
if x > y then 1 else -1

我们可以达到同样的可读性。

总而言之,当不可能或几乎不可能用 when 表达相同的代码时,最好使用 if/then/else 。为了提高可读性,最好将您的逻辑分解为具有可读名称的辅助函数。例如,使用 dcmp 最好的解决方案是既不使用 if 也不使用 when ,例如,

let dcmp (D (x,y)) = compare x y

1)在这种特殊情况下,编译器将为 whenif/then/else 生成相同的代码。但在更一般的情况下,守卫可能会阻止匹配的编译器生成有效的代码,尤其是当分支不相交时。在我们的例子中,编译器只是注意到我们重复了相同的分支并将它们合并为一个分支并将其转换回 if/then/else 表达式,例如,这里是函数的 cmm 输出,带有 when 保护,

(if (> x y) 3 (if (< x y) -1 1))

这与 dcmp 函数的 if/then/else 版本生成的代码完全相同。

2) 当然,不是到它不会注意到丢失分支的状态,而是到它会不太准确地报告丢失的分支或会要求您添加不必要的分支的状态。

关于performance - 在 OCaml 模式匹配中哪个更好, `when` 或 `if-then-else` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66495443/

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