Seq.groupBy的Seq.where

时间:2014-09-11 20:17:46

标签: 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

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

  

类型不匹配。期待一个       char * seq - >布尔
  但给了一个       char - >布尔
  类型' char * seq'与' char'

类型不符

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

1 个答案:

答案 0 :(得分:5)

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

Seq.where (fun (char, s) -> charIsVowel char)

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

Seq.where (fst >> charIsVowel)

fst函数将(char, s)转换为char,然后>>运算符将结果传递给charIsVowel

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

Seq.groupBy id