簡體   English   中英

為什么F#Interactive在排序方面與Console運行不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM