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

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

最佳答案

我认为这是类型推断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

关于compiler-errors - s.Count(Char.IsLetter)有什么问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23960985/

10-11 23:47