Quando si ordina una sequenza di carri contenenti un NaN, Seq.sort mette i NaNs alla testa del risultato:comportamento incoerente di Seq.sort e Seq.sortBy per la sequenza di carri contenenti un NaN
> [ 0.0; nan; 1.0; nan; -1.0 ] |> Seq.sort
val it : seq<float> = seq [nan; nan; -1.0; 0.0; ...]
Tuttavia, Seq.sortBy sembra fallire, e passa semplicemente la sequenza on, unsorted. Presumibilmente questo perché NaN viola i principi di base degli ordini.
> [ 0.0; nan; 1.0; nan; -1.0 ] |> Seq.sortBy id
val it : seq<float> = seq [0.0; nan; 1.0; nan; ...]
Non viene generata un'eccezione che potrebbe indicare che SortBy non è riuscito a produrre un elenco ordinato, e questo può portare a un comportamento sorprendente nel codice che si basa su di esso. È facile codificare il problema una volta trovato, ma è più difficile da prevedere, e quindi è probabile che causi bug.
C'è una buona ragione per ordinare e ordinare Per essere incoerente in questo modo?
Penso che questo fissai per F # 4 (dovrebbero comportarsi lo stesso) e in effetti questo è un bug (o almeno un odore) - in ogni caso con 'NaN's voi potrebbe obiettare che non esiste un modo per ordinare realmente l'array (in questo momento il problema potrebbe essere che 'confronta nan _ = 0' ma' nan < _ = nan > _ = nan = x = false' (forse possiamo fare un veloce F # /. net WAT video con questo) – Carsten