[英]F#: Using Enumerable.GroupBy in F#
我是F#的新手,目前对.NET API非常不熟悉。
我想在F#程序中使用.NET Enumerable.GroupBy方法 。 这是我的代码中的相关示例:
let atLeast2Values (key , values) =
Seq.length values > 1
let findGroupsOfTwoOrMore (directory: string) =
let getPath = snd
let getLength = fst
let fileNameLengthPairs = new DirectoryInfo(directory)
|> getFileLengthAndFileNameTuples
fileNameLengthPairs.GroupBy(keySelector = getLength, elementSelector = getPath)
|> Seq.filter atLeast2Values
不幸的是,运行此代码将返回以下错误消息:
Program.fs(37,51):错误FS0001:该表达式应具有类型
Func<(int64 * string),'a>
但是这里有类型
'b * 'c -> 'b
我该如何解决该错误?
编辑:这是getFileLengthAndFileNameTuples函数:
let rec getFileLengthAndFileNameTuples (dirInfo: DirectoryInfo) =
seq {
let nameLengthPairs = dirInfo.GetFiles()
|> Seq.map (fun fileInfo -> (fileInfo.Length, fileInfo.FullName))
yield! nameLengthPairs
let subFolders = dirInfo.GetDirectories()
for subFolder in subFolders do
yield! getFileLengthAndFileNameTuples subFolder
}
假设fileNameLengthPairs
的类型为:
val fileNameLengthPairs : seq<int * string>
您可以使用下面的代码。
fileNameLengthPairs
|> Seq.groupBy (fun (length, _) -> length)
|> Seq.filter (fun (key, value) -> (Seq.length value) > 1)
最好使用F#模块中的Seq.groupBy
,因为它可以部分应用,并且代码看起来更流畅,更实用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.