请有人在这里检查我的理智。鉴于这个简单的功能:
let filterOut item l =
l |> List.filter (fun t -> not (t = item))
let f =
["1";"2";"3"]
|> filterOut "3"
在FSI中评估上述内容会产生以下结果:
在Mac OS X上使用mono 4.0.3的Xamarin Studio
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))
甚至以下代码在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函数中添加“inline”,我也会在两个平台上得到正确的结果(OS X上的预期输出)。同样,Mono运行时上的通用比较器似乎有问题。
答案 0 :(得分:2)
(1个月后)在最新的Mono 4.2.0上测试,现在按预期工作。