【问题标题】:Why is F# Interactive different from Console run with respect of sorting?为什么 F# Interactive 在排序方面与控制台运行不同?
【发布时间】:2014-12-24 03:44:08
【问题描述】:

我对 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

当我尝试通过控制台运行时:

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 中的工作方式不同,因为当您靠近我的比较器时,它不能正确处理相同索引的情况(尽管我不知道为什么排序算法需要检查相同的索引)。 所以,当我为

添加另一个匹配时
| _, _ when i = j -> 0

它开始工作了。但是,仍然感到困惑,没有它我会得到不同的结果。

【问题讨论】:

  • 我猜,这两种方法之一的早期定义存在冲突

标签: arrays sorting f# f#-interactive


【解决方案1】:

+1 对约翰·帕尔默的评论。您的 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|]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    相关资源
    最近更新 更多