F# Seq.where与Seq.groupBy

F# Seq.where与Seq.groupBy,f#,F#,在学习F#的过程中,我做了一个小挑战: 输入一个字符串,程序计算文本中元音的数量。为了增加复杂性,请报告找到的每个元音的总和 这就是我到目前为止所做的: let rec Main = let vowels = [| 'a'; 'e'; 'i'; 'o'; 'u'|] let charIsVowel char = Seq.exists ((=) char) vowels let inputText = Console.ReadLine() let expres

在学习F#的过程中,我做了一个小挑战:

输入一个字符串,程序计算文本中元音的数量。为了增加复杂性,请报告找到的每个元音的总和

这就是我到目前为止所做的:

let rec Main = 
    let vowels = [| 'a'; 'e'; 'i'; 'o'; 'u'|]
    let charIsVowel char = Seq.exists ((=) char) vowels

    let inputText = Console.ReadLine()

    let expression = 
        inputText
        |> Seq.groupBy (fun char -> char)
        |> Seq.where charIsVowel
问题是我无法访问分组的键,该键是
char
,因此我无法过滤序列。 具体错误是:

类型不匹配。期待 字符*顺序->布尔
但是给一个 char->bool
类型“char*seq”与类型“char”不匹配


最后,我想根据它们的键过滤一系列摸索。我该怎么做

在调用charIsVowel之前,只需先将元组拆开:

Seq.where (fun (char, s) -> charIsVowel char)
另一种方法是使用
fst
函数和函数组合:

Seq.where (fst >> charIsVowel)
fst
函数将
(char,s)
转换为
char
,然后
>
操作符将结果传递到
charIsVowel

请注意,
groupBy
中的
(fun char->char)
可以简单地表示为标识函数
id

Seq.groupBy id

这是我得出的最终结果:还有其他建议吗?@CasterTroy个人认为,为了匹配你所追求的语义,我会将
元音
更改为一个集合:
让元音=集合(['a';'e'])
等,然后做
让Isvowell c=元音|>集合。包含c
。顺便说一句,它在查找过程中的性能也会更高,在这种情况下,这一点都不重要。否则,从我的角度来看,看起来不错。:)@PatrykĆwiek谢谢你,巴德。@PatrykĆwiek或者实际上是
let isVowel=vowels.Contains
@phoog绝对,我在内联输入注释时不知怎么错过了这个选项…:)一种更有效的检查元音的方法:
让元音=set['A';'e';'i';'o';'u'];让charIsVowel c=元音。包含c
或者,实际上,简单地
让charIsVowel=元音。包含