Seq.groupBy的Seq.where

Cas*_*roy 3 f#

在学习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
Run Code Online (Sandbox Code Playgroud)

问题是我无法访问分组的密钥,char因此我无法过滤序列.具体错误是:

类型不匹配.期待一个char*seq - > bool
但是给了一个char - > bool
类型'char*seq'与'char'类型不匹配

最终,我想根据他们的关键过滤一系列的gropings.我怎样才能做到这一点?

GS *_*ica 5

你只需要先打开元组,然后再打电话charIsVowel:

Seq.where (fun (char, s) -> charIsVowel char)
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用fst函数和函数组合:

Seq.where (fst >> charIsVowel)
Run Code Online (Sandbox Code Playgroud)

fst功能将(char, s)进入char,然后>>操作者将结果传递到charIsVowel.

请注意,您(fun char -> char)groupBy可以简单地表示为标识的功能id:

Seq.groupBy id
Run Code Online (Sandbox Code Playgroud)