[英]Why is F# Interactive different from Console run with respect of sorting?
對於我來說,F#交互輸出和控制台輸出之間的區別讓我感到困惑。
問題概述:
給定長度為n的數組A,按以下順序對索引進行排序:
index[i] < index[j] if (A[i] < A[j]) or (A[i] = A[j] and i < j)
例如
[| 4; 2; 4; 2; 1; 1 |]
索引在這里會像這樣排序
[| 4; 5; 1; 3; 0; 2 |]
let GetSorted (A:int[]) =
let Comparer i j =
match (A.[i], A.[j]) with
| a1, a2 when a1 > a2 -> +1
| a1, a2 when a1 < a2 -> -1
| _, _ when i > j -> +1
| _, _ -> -1
let lenA = A |> Array.length
[| 0 .. lenA - 1 |] |> Array.sortWith Comparer
let A = [| 0; 0; 0; 0; 0; 0; 0; 0; 42; 0; 0; 0; 0; 0; 0; 0; 41 |]
let sortedPositions = GetSorted A
當我在F#交互式腳本中運行上述腳本時,得到以下信息:
val sortedPositions : int [] =
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 16; 8|]
注意,最后兩個索引是16和8。這是正確的,因為41 <42
當我嘗試通過控制台運行時做到這一點:
sortedPositions |> Array.iter(Console.WriteLine)
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 8; 16|]
我沒有找到另一個長度的數組,因此兩次運行將得出不同的結果,到目前為止僅發現了17個。
為什么會這樣呢? 我懷疑排序在F#Interactive中的工作方式有所不同,因為當您靠近我的Comparer時,它無法使用相同的索引正確處理情況(盡管我不知道為什么排序算法需要檢查相同的索引)。 所以,當我添加另一個匹配項
| _, _ when i = j -> 0
它開始工作。 但是,仍然感到困惑的是,沒有它我會得到不同的結果。
+1約翰·帕爾默(John Palmer)的評論。 您不記得創建的舊函數和值定義可能會干擾您的FSI會話,從而使它們受到污染。
我可以確認它在FSI中的工作原理完全相同,並已編譯為控制台應用程序。 嘗試完全重置FSI會話並重新定義函數/值。
C:\Users\latkin\Source
> type .\test.fsx
let GetSorted (A:int[]) =
let Comparer i j =
match (A.[i], A.[j]) with
| a1, a2 when a1 > a2 -> +1
| a1, a2 when a1 < a2 -> -1
| _, _ when i > j -> +1
| _, _ -> -1
Array.init A.Length id |> Array.sortWith Comparer
[| 0; 0; 0; 0; 0; 0; 0; 0; 42; 0; 0; 0; 0; 0; 0; 0; 41 |]
|> GetSorted
|> printfn "%A"
C:\Users\latkin\Source
> & 'C:\Program Files (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0\Fsc.exe' .\test.fsx
Microsoft (R) F# Compiler version 14.0.22416.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
C:\Users\latkin\Source
> .\test.exe
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 16; 8|]
C:\Users\latkin\Source
> & 'C:\Program Files (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0\Fsi.exe' .\test.fsx
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 16; 8|]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.