很抱歉,如果这个问题真的很愚蠢,那就开始用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
,它将接受字符串(名称)数组并执行以下操作:
现在这几乎可以工作了(除了排序部分,它根本没有排序,现在这很好)但是我对以下内容感到困惑 - 如果我用以下内容替换#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
但我仍然得到同样的信息。
任何人都可以解释这里有什么问题吗?编译一个和非编译有什么区别?更重要的是,我在哪里可以阅读有关此行为的更多信息?
答案 0 :(得分:2)
使用此签名进行排序的功能
Array.sortWith : ('T -> 'T -> int) -> 'T [] -> 'T []
然后你的lambda需要有
的签名('T -> 'T -> int)
但你的只是
'T -> int
您可能需要sortBy
而不是sortwith需要比较器功能