【问题标题】:F# on Mono and Windows - discrepancy with simple functionMono 和 Windows 上的 F# - 与简单功能的差异
【发布时间】:2015-10-19 01:55:29
【问题描述】:

请有人在这里检查我的理智。鉴于这个简单的功能:

let filterOut item l =
  l |> List.filter (fun t -> not (t = item)) 

let f = 
  ["1";"2";"3"]
  |> filterOut "3"

在 FSI 中评估上述内容会产生以下结果:

  1. Mac OS X 上带有单声道 4.0.3 的 Xamarin Studio

    val f : 字符串列表 = ["1"]

  2. Visual Studio 2013

    val f : 字符串列表 = ["1"; "2"]

如果输入是整数或字符的列表 - 那么它会按预期工作,并且两个平台都会产生相同的结果。此外,如果我指定 filterOut 仅使用字符串,它会正确生成相同的值。像这样:

 let filterOut item l:list<string> =
   l |> List.filter (fun t -> not (t = item)) 

即使是在 OS X 上使用 XS 的以下代码:

let filterOut item l =
  l |> List.filter (fun t -> not (t = item)) 

let f = 
  ["1";"2";"3"]
  |> filterOut "foobar"

输出:

val f : string list = ["1"]

我比较了 XS 和 VS 编译代码之间的 IL,它们看起来相同。因此,这似乎是运行时差异。 如果 List.Filter 和 Mono 上的字符串进行泛型比较有什么问题?

编辑:如果我在 filterOut 函数中添加“内联”,我也会在两个平台上得到正确的结果(OS X 上的预期输出)。 Mono 运行时上的通用比较器似乎又出现了问题。

【问题讨论】:

  • 我使用 Linux Mono 4.0.2 检查了它,第一个例子给了我正确的输出 ["1"; “2”]。但是带有“foobar”的第二个给出了不正确的 ["1"; “2”]。在这两种情况下,将定义与内联一起使用都会给出正确的答案。为了检查 Windows 上的正确性,我使用了dotnetfiddle.net
  • @lad2025 感谢您的检查。
  • 显然是一个错误,正如你所说,它看起来可能是 Mono 运行时的一个问题,你能针对 Mono 运行时提交一个错误吗? mono-project.com/community/bugs
  • @PhillipTrelford 谢谢 - 忙着呢。

标签: f# mono


【解决方案1】:

(1 个月后)在最新的 Mono 4.2.0 上测试,现在可以按预期工作。

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2022-10-01
    • 2018-01-18
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多