给定一个从 -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)
返回 -8 而不是 1。这对我来说似乎是正确的,我找不到错误,但我是 F# 新手,所以我可能在任何地方犯了错误并且看不到它:(
提前致谢
最佳答案
我认为你的比较方式是错误的 - 当你写道:
match distanceA with
| Greater distanceB -> b
| Smaller distanceB -> a
然后 distanceA
作为第二个参数传递给 Greater
,因此您将返回 b
(在第一种情况下),以防 code>b
离零更远。以下内容将使它工作:
match distanceA with
| Greater distanceB -> a
| Smaller distanceB -> b
也就是说,为此使用事件模式只会使代码变得不必要的复杂(并且很容易引入像这样的错误)。下面的代码做了同样的事情,而且很容易理解,也简单得多:
let compareTemperatures a b =
if abs a > abs b then b else a
temps |> Seq.reduce compareTemperatures
我认为这里的教训是模式匹配对于代数数据类型和选项值之类的东西非常有效,但对于 if
工作正常的简单数字比较就没那么有用了!
关于F# 整数比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447807/