Seq.sort 和 Seq.sortBy 对于包含 NaN 的浮点序列的不一致行为

Inconsistent behaviour of Seq.sort and Seq.sortBy for sequence of floats containing a NaN

对包含 NaN 的浮点数序列进行排序时,Seq.sort 将 NaN 放在结果的开头:

> [ 0.0; nan; 1.0; nan; -1.0 ] |> Seq.sort
val it : seq<float> = seq [nan; nan; -1.0; 0.0; ...]

然而,Seq.sortBy 似乎失败了,只是简单地传递了未排序的序列。大概这是因为 NaN 违反了基本的排序原则。

> [ 0.0; nan; 1.0; nan; -1.0 ] |> Seq.sortBy id
val it : seq<float> = seq [0.0; nan; 1.0; nan; ...]

没有抛出可能表明 sortBy 未能生成排序列表的异常,这可能会导致依赖它的代码出现令人惊讶的行为。一旦发现问题,就很容易对其进行编码,但更难预测,因此很可能会导致错误。

sort 和 sortBy 以这种方式不一致是否有充分的理由?

此问题已在上游修复:https://github.com/Microsoft/visualfsharp/issues/370