F# Seq.where与Seq.groupBy
在学习F#的过程中,我做了一个小挑战: 输入一个字符串,程序计算文本中元音的数量。为了增加复杂性,请报告找到的每个元音的总和 这就是我到目前为止所做的: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
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=元音。包含