给定从-273到5526的列表int,我想将最接近的整数打印到零.如果你有平等(n和-n)我们应该拿n.
let temps = // this contains => 1 -2 -8 4 5
let (|Greater|_|) a b = if a > b then Some() else None
let (|Smaller|_|) a b = if a < b then Some() else None
let compareTemperatures a b =
let distanceA = abs a
let distanceB = abs b
match distanceA with
| Greater distanceB -> b
| Smaller distanceB -> a
| _ -> abs a
printfn "%i" (temps |> Seq.reduce compareTemperatures)
Run Code Online (Sandbox Code Playgroud)
并且返回-8而不是1.这对我来说似乎是正确的,我找不到错误,但我是F#的新手,所以我可能在任何地方都犯了一个错误,看不到它:(
提前致谢
Tom*_*cek 10
我认为你的比较是错误的 - 当你写:
match distanceA with
| Greater distanceB -> b
| Smaller distanceB -> a
Run Code Online (Sandbox Code Playgroud)
然后distanceA作为第二个参数传递到Greater,因此你将返回b(在第一种情况下),以防b更远离零.以下将使其工作:
match distanceA with
| Greater distanceB -> a
| Smaller distanceB -> b
Run Code Online (Sandbox Code Playgroud)
也就是说,使用活动模式只会使代码变得不必要地复杂化(并且很容易引入像这样的错误).以下是相同的事情,它易于理解,也更简单:
let compareTemperatures a b =
if abs a > abs b then b else a
temps |> Seq.reduce compareTemperatures
Run Code Online (Sandbox Code Playgroud)
我认为这里的教训是模式匹配对于代数数据类型和选项值等问题非常有效,但对于简单的数值比较而言,它并不是很有用if!