在学习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.我怎样才能做到这一点?
你只需要先打开元组,然后再打电话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)