gpt4 book ai didi

f# - 在F#中使用后卫与if/else构造进行模式匹配

转载 作者:行者123 更新时间:2023-12-04 05:33:37 25 4
gpt4 key购买 nike

在ML系列语言中,人们倾向于使用模式匹配而不是if/else构造。在F#中,在许多情况下,在模式匹配内使用防护可以轻松替换if/else

例如,无需使用delete1即可重写一个简单的if/else函数(请参阅delete2):

let rec delete1 (a, xs) =
match xs with
| [] -> []
| x::xs' -> if x = a then xs' else x::delete1(a, xs')

let rec delete2 (a, xs) =
match xs with
| [] -> []
| x::xs' when x = a -> xs'
| x::xs' -> x::delete2(a, xs')

另一个例子是求解二次函数:
type Solution =
| NoRoot
| OneRoot of float
| TwoRoots of float * float

let solve1 (a,b,c) =
let delta = b*b-4.0*a*c
if delta < 0.0 || a = 0.0 then NoRoot
elif delta = 0.0 then OneRoot (-b/(2.0*a))
else
TwoRoots ((-b + sqrt(delta))/(2.0*a), (-b - sqrt(delta))/(2.0*a))

let solve2 (a,b,c) =
match a, b*b-4.0*a*c with
| 0.0, _ -> NoRoot
| _, delta when delta < 0.0 -> NoRoot
| _, 0.0 -> OneRoot (-b/(2.0*a))
| _, delta -> TwoRoots((-b + sqrt(delta))/(2.0*a),(-b - sqrt(delta))/(2.0*a))

我们应该使用带有 guard 的模式匹配来忽略丑陋的 if/else构造吗?

使用防护模式匹配是否有任何性能暗示?我的印象是,它似乎很慢,因为已经在运行时检查了模式匹配。

最佳答案

正确的答案可能取决于情况,但是我想,在大多数情况下,编译后的表示是相同的。举个例子

let f b =
match b with
| true -> 1
| false -> 0


let f b =
if b then 1
else 0

都翻译成
public static int f(bool b)
{
if (!b)
{
return 0;
}
return 1;
}

鉴于此,这主要是风格问题。就我个人而言,我更喜欢模式匹配,因为案例总是对齐的,从而使其更具可读性。而且,它们(可以说)更容易在以后扩展以处理更多案件。我认为模式匹配是 if/ then/ else的演变。

无论有没有保护措施,模式匹配也没有额外的运行时成本。

关于f# - 在F#中使用后卫与if/else构造进行模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986641/

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