有人可以在这里检查我的理智吗.鉴于这个简单的功能:
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中评估以上内容产生以下结果:
Xamarin Studio在Mac OS X上使用mono 4.0.3
val f:string list = ["1"]
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运行时上的通用比较器似乎有问题.