F# 整数比较

标签 f#

给定一个从 -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/

相关文章:

F# 过于激进的类型推断?

f# - 这是对查询中的十进制值类型求和的最佳方式吗?

f# - 如何在已编译的 F# 程序中执行在字符串中找到的 F# 代码?

f# - 递归计算表达式

c# - 在运行时从 C# 检测 F# 记录类型

.net - 为什么 F# 不支持“编辑并继续”?

types - # 符号在 f# 函数签名中是什么意思?

parsing - 如何解决 FParsec 错误 "The combinator ' much' 已应用于解析器,该解析器无需消耗即可成功......”

c# - 如何通过 System.Data.SQLite 检索 F# 查询表达式的 SQL 查询字符串?

f# - 构建代码表达式 "Manually"