gpt4 book ai didi

F#:不理解 match .. with

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

我正在研究 F# 和 Fable,并试图测试我的理解力。为此,我尝试创建一个函数来计算给定一定迭代次数的 e。我想到的是

let eCalc n =
let rec internalECalc ifact sum count =
match count = n with
| true -> sum
| _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)

internalECalc 1.0 0.0 1

哪个工作正常,调用时返回 2.7182818284590455

eCalc 20

但是,如果我尝试使用我认为更正确的形式

let eCalc n =
let rec internalECalc ifact sum count =
match count with
| n -> sum
| _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)

internalECalc 1.0 0.0 1

我收到警告“[WARNING] This rule will never be matched (L5,10-L5,11)”,并返回值 0。(如果我交换 'n' 和 'count' 也会发生同样的事情在匹配语句中)。我不能在匹配语句中使用“n”有什么原因吗?有没有办法解决这个问题,以便我可以使用“n”?

谢谢

最佳答案

当您在 match 语句中使用名称时,您不会按照您认为的方式将其与分配给该变量的值进行检查。您正在分配那个名字。即,

match someInt with
| n -> printfn "%d" n

将打印 someInt 的值。它等同于 let n = someInt; printfn "%d"n.

您想做的是使用when 子句;在 when 子句中,您不是在进行模式匹配,而是在执行“标准”if 检查。所以你想要的是:

let eCalc n =
let rec internalECalc ifact sum count =
match count with
| cnt when cnt = n -> sum
| _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)

internalECalc 1.0 0.0 1

这是否有意义,或者您需要我详细说明吗?

附言在这种情况下,您的匹配函数看起来像“x when (boolean condition involving x) -> case 1 | _ -> case 2”,使用简单的 if 会更易读> 表达:

let eCalc n =
let rec internalECalc ifact sum count =
if count = n then
sum
else
internalECalc (ifact / (float count)) (sum + ifact) (count+1)

internalECalc 1.0 0.0 1

关于F#:不理解 match .. with,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38711655/

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