该表达式应该具有类型字符串 - > int但是这里有int类型

时间:2015-12-16 20:56:22

标签: f#

很抱歉,如果这个问题真的很愚蠢,那就开始用F#弄湿了(来自C#)。

假设我有以下内容:

1: let Foo (names : string[]) =
2:    let favNames : string[] = 
3:        Array.filter(fun name -> name.StartsWith("M")) names
4:    let sortByLengthOfName (x : string) : int = x.Length       
5:    let sortedNamesByLegth : string[] = 
6:        Array.sortWith(fun name -> fun n -> n.Length) favNames
7:    Array.iter(fun name -> printfn "%s" name) sortedNamesByLegth

这里我试图定义/(声明?)一个函数Foo,它将接受字符串(名称)数组并执行以下操作:

  1. 仅返回以M
  2. 开头的名称来过滤数组
  3. 按名称长度排序
  4. 打印结果
  5. 现在这几乎可以工作了(除了排序部分,它根本没有排序,现在这很好)但是我对以下内容感到困惑 - 如果我用以下内容替换#5,6行:

    let sortedNamesByLegth : string[] = 
        Array.sortWith(fun name -> sortByLengthOfName name) favNames
    

    编译器开始抱怨This expression was expected to have type string -> int but here has type int。现在这让我感到困惑,因为sortByLegnthOfName对我来说是string -> int。我沿着这些方向试了一下

    let sortedNamesByLegth : string[] = 
        Array.sortWith(fun name -> (sortByLengthOfName name)) favNames
    

    但我仍然得到同样的信息。

    任何人都可以解释这里有什么问题吗?编译一个和非编译有什么区别?更重要的是,我在哪里可以阅读有关此行为的更多信息?

1 个答案:

答案 0 :(得分:2)

使用此签名进行排序的功能

Array.sortWith : ('T -> 'T -> int) -> 'T [] -> 'T []

然后你的lambda需要有

的签名
('T -> 'T -> int)

但你的只是

'T -> int

您可能需要sortBy而不是sortwith需要比较器功能