【发布时间】:2015-03-11 10:15:56
【问题描述】:
我是 F# 新手,目前对 .NET API 非常陌生。
我想在 F# 程序中使用.NET Enumerable.GroupBy method。这是我的代码中的相关示例:
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的类型是什么?你可以添加getFileLengthAndFileNameTuplesfunction 吗?最好使用sequence提供的groupby (Seq.groupBy msdn.microsoft.com/en-us/library/ee370445.aspx) -
你好,托马斯。我已按要求添加了该功能。我使用 Enumerable.GroupBy 因为我想指定元素选择器。 F# 中的 Seq.groupBy 不会完成相同的操作。谢谢。
-
GroupBy(keySelector = Func<_, _>(getLength), elementSelector = Func<_, _>(getPath))有趣的是,当您不使用命名参数时,它似乎得到了正确的Func:GroupBy(getLength, getPath)