gpt4 book ai didi

f# - 互斥子句的顺序在函数或匹配表达式中是否重要

转载 作者:行者123 更新时间:2023-12-04 17:10:20 25 4
gpt4 key购买 nike

function 中的when 子句和 match陈述并不相互排斥,顺序显然很重要。但是,当子句相互排斥时,它们可以按任何顺序编写。例如,要查找列表中的最小元素,以下在功能上是等效的:

let rec minElt =
function
| [] -> failwith "empty list"
| [x0] -> x0
| x0::xtl -> min x0 (minElt xtl)

let rec minElt =
function
| [x0] -> x0
| x0::xtl -> min x0 (minElt xtl)
| [] -> failwith "empty list"

我在风格上更喜欢第一个,因为模式是按大小递增的顺序列出的/基本情况是第一个。但是,第二个有什么优势吗?特别是,第二个是否更有效,因为在正常评估过程中永远不会检查异常情况?

最佳答案

我不认为有任何既定的惯用风格。我会首先专注于使代码可读和可理解 - 我认为这取决于个人喜好,但我想你可以这样写:

  • 首先是特殊情况(任何需要特殊处理的东西,或者处理特殊但有效的值)
  • 接下来是最常见的情况(典型路径,例如 x::xs 用于列表)
  • 特殊情况(任何意味着无效输入的情况)

  • 我想这就是我通常倾向于编写模式匹配的方式(因为这是我考虑可能情况的顺序)。

    我不会太担心性能。出于好奇,我测试了您的功能。我在长度为 1 到 100 的列表上调用了 1000 次(所以是 100000 次迭代),第一个大约为 895 毫秒,而第二个为 878 毫秒,因此差异为 2%。听起来不像是对可读性很重要的东西(这是在 F# Interactive 中,所以差异可能更小)。

    关于f# - 互斥子句的顺序在函数或匹配表达式中是否重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18770646/

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