s.Count有什么问题(Char.IsLetter)

时间:2014-05-30 18:16:42

标签: compiler-errors f#

F#

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

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

  

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

2 个答案:

答案 0 :(得分:4)

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

您可以通过指定从F#函数到System.Func<_, _>的转换来解决:

s.Count(Func<_, _>(Char.IsLetter))

当然,它比相应的版本更加丑陋:

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

您可以在https://visualfsharp.codeplex.com/workitem/list/basic提交错误,以便在F#vNext中修复。

请注意,在F#中,您不经常使用Linq功能。你可以这样做:

s |> Seq.sumBy (fun c -> if Char.IsLetter c then 1 else 0)

s |> Seq.filter Char.IsLetter |> Seq.length

答案 1 :(得分:3)

Daniel似乎对type inference problem是正确的。

它看起来不太好,但以下似乎有效。

Char.IsLetter |> s.Count