【发布时间】:2015-08-08 01:28:52
【问题描述】:
我是 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
【问题讨论】: