Compiler errors s.Count(Char.isleter)有什么问题

Compiler errors s.Count(Char.isleter)有什么问题,compiler-errors,f#,Compiler Errors,F#,F# 为什么只有最后一行无法编译: 错误FS0002:此函数接受的参数太多,或者在不需要函数的上下文中使用 丹尼尔对这个问题的看法似乎是正确的 这看起来不太好,但下面的方法似乎有效 let s = "bugs 42 bunny" s.Count(fun c -> Char.IsLetter(c)) s.Where(fun c -> Char.IsLetter(c)).ToArray() s.Where(Char.IsLetter).ToArray() s.Count(Char.IsL

F#

为什么只有最后一行无法编译:

错误FS0002:此函数接受的参数太多,或者在不需要函数的上下文中使用


丹尼尔对这个问题的看法似乎是正确的

这看起来不太好,但下面的方法似乎有效

let s = "bugs 42 bunny"
s.Count(fun c -> Char.IsLetter(c))
s.Where(fun c -> Char.IsLetter(c)).ToArray()
s.Where(Char.IsLetter).ToArray()
s.Count(Char.IsLetter) // error

我认为这是类型推断wrt成员重载的一种边缘情况。
Count
Where
之间的区别在于前者有两个参数数量不同的重载

您可以通过指定从F#函数到
System.Func的转换来解决此问题:

您可以在上提交一个bug,以便在F#vNext中修复它

注意,在F#中,您不经常使用Linq函数。您可以执行以下任一操作:

s.Count(fun c -> Char.IsLetter(c))


这是一个类型推断边缘案例()。丹尼尔,我想你说到点子上了。Where()和Count()之间的区别在于Count()有一个没有参数的重载,编译器显然匹配这个参数的重载更少,并且卡住了。调用很好。使用从左到右的评估对您有利,而不是对抗它。
s.Count(Func<_, _>(Char.IsLetter))
s.Count(fun c -> Char.IsLetter(c))
s |> Seq.sumBy (fun c -> if Char.IsLetter c then 1 else 0)
s |> Seq.filter Char.IsLetter |> Seq.length