单声道和Windows上的F# - 与简单功能的差异

Kev*_*vin 7 mono f#

有人可以在这里检查我的理智吗.鉴于这个简单的功能:

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

let f = 
  ["1";"2";"3"]
  |> filterOut "3"
Run Code Online (Sandbox Code Playgroud)

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

  1. Xamarin Studio在Mac OS X上使用mono 4.0.3

    val f:string list = ["1"]

  2. Visual Studio 2013

    val f:string list = ["1"; "2"]

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

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

甚至以下代码在OS X上使用XS:

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

let f = 
  ["1";"2";"3"]
  |> filterOut "foobar"
Run Code Online (Sandbox Code Playgroud)

输出:

val f : string list = ["1"]
Run Code Online (Sandbox Code Playgroud)

我比较了XS和VS编译代码之间的IL,它们看起来完全相同.所以它似乎是一个运行时差异.如果这里有List.Filter和Mono上的字符串的一般比较吗?

编辑:如果我在filterOut函数中添加"inline",我也会在两个平台上得到正确的结果(OS X上的预期输出).同样,Mono运行时上的通用比较器似乎有问题.

Kev*_*vin 2

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