gpt4 book ai didi

F# 多条件 if/else 与匹配

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

我是 F# 的新手,一直在实现简单的算法来学习语言结构。我使用 if/else 实现了二分法,然后想学习如何使用匹配来实现。

if fc = 0.0                   then printfn "%i/%i - f(%f) = %f, f(%f) = %f, f(%f) = %f" new_count n a fa b fb c fc
else if ((b - a) * 0.5) < eps then printfn "%i/%i - f(%f) = %f, f(%f) = %f, f(%f) = %f" new_count n a fa b fb c fc
else if new_count = n then printfn "%i/%i - f(%f) = %f, f(%f) = %f, f(%f) = %f" new_count n a fa b fb c fc
else if fc * fa < 0.0 then bisect a c new_count
else if fc * fb < 0.0 then bisect c b new_count

我发现使用 match a, b, fa, fb, fc 会导致类型错误,如果我只使用一个参数,我基本上可以忽略该参数并检查我的条件。为此使用匹配的惯用 F#/Functional 方式是什么?或者我应该坚持 if/else 吗?
 match a with 
| a when fc = 0.0 -> printfn "%i/%i - f(%f) = %f, f(%f) = %f, f(%f) = %f" new_count n a fa b fb c fc
| a when ((b - a) * 0.5) < eps -> printfn "%i/%i - f(%f) = %f, f(%f) = %f, f(%f) = %f" new_count n a fa b fb c fc
| a when new_count = n -> printfn "%i/%i - f(%f) = %f, f(%f) = %f, f(%f) = %f" new_count n a fa b fb c fc
| a when fc * fa < 0.0 -> bisect a c new_count
| a when fc * fb < 0.0 -> bisect c b new_count

最佳答案

你的条件都处理不同的事情,彼此无关,所以 if 的字符串就好了。我唯一推荐的是使用 elif 而不是 else if
match 应该按照“给定这个可能有不同风格的东西,这里是如何处理这些风格”的路线来理解。 match 的一个特殊优势是编译器会找出并告诉您,如果您错过了任何“ flavor ”。特别是,您在问题中给出的代码应该会产生编译器警告,提示“此表达式上的模式匹配不完整”。想一想:当所有情况都不匹配时,该表达式的结果是什么?

对于 if s,情况也是如此。例如,这不会编译:

let x = if a < 5 then 7

为什么?因为编译器知道 a < 5 时的结果应该是什么(即它应该是 7 ),但否则应该是什么?编译器无法为您做出决定,因此会产生错误。
另一方面,这将编译:
let x = if a < 5 then 7 else 8

但是在您的特定情况下,编译器可以让您摆脱这种情况,因为您的所有分支都返回 unit (为什么?因为 printf 返回 unit ,而所有其他分支都是递归的)。换句话说,以下将编译:
let x = if a < 5 then ()

以及以下内容:
let x = if a < 5 then printf "boo!"

编译器让您摆脱这种情况,因为 unit 很特殊:它只能有一个值(即 () ),因此编译器可以为您决定当条件不是 true 时表达式的结果是什么。

这样做的一个实际结果是,如果您没有非常仔细地考虑您的条件,可能会发生这样的情况,您的条件都不是 true ,因此整个过程将返回 unit 并且不打印任何内容。我不能说在您的特定情况下是否会发生这种情况,因为我没有看到整个函数定义。

关于F# 多条件 if/else 与匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877649/

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