单声道和Windows上的F#与简单函数的差异

单声道和Windows上的F#与简单函数的差异,f#,mono,F#,Mono,有人能检查一下我的精神状况吗。鉴于此简单功能: 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:字符串列表=[“1”] Visual Studio 2013 val f:字

有人能检查一下我的精神状况吗。鉴于此简单功能:

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:字符串列表=[“1”]

  • Visual Studio 2013

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

  • 如果输入是一个int或char列表,那么它将按预期工作,并且两个平台产生相同的结果。此外,如果我将filterOut指定为仅处理字符串,它将正确地生成相同的值。像这样:

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

    val f : string list = ["1"]
    
    我比较了XS和VS编译代码之间的IL,它们看起来完全相同。因此,这似乎是运行时的差异。 如果在Mono上List.Filter和字符串的一般比较出现了问题


    编辑:如果我将“inline”添加到filterOut函数中,我也可以在两种平台上获得正确的结果(在OSX上预期的输出)。Mono运行时上的通用比较器似乎又出了问题。

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

    我使用Linux Mono 4.0.2检查了它,第一个示例给出了正确的输出[“1”;“2”]。但是带有“foobar”的第二个给出了不正确的[“1”;“2”]。在这两种情况下,使用definition和inline都能给出正确的答案。为了在Windows上检查正确性,我使用了@lad2025,感谢您的检查。很明显,正如您所说的,一个bug可能是Mono运行时的问题,您可以针对Mono运行时提交一个bug吗@PhillipTrelford谢谢-忙得不可开交。
    val f : string list = ["1"]