2015-04-30 12 views
6

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?

+2

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

risposta

Problemi correlati