在学习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。我怎样才能做到这一点?
答案 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