【问题标题】:F#: Using Enumerable.GroupBy in F#F#:在 F# 中使用 Enumerable.GroupBy
【发布时间】: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)) 有趣的是,当您不使用命名参数时,它似乎得到了正确的FuncGroupBy(getLength, getPath)

标签: .net f#


【解决方案1】:

假设fileNameLengthPairs 的类型为:

val fileNameLengthPairs : seq<int * string>

您可以使用下面的代码。

fileNameLengthPairs
|> Seq.groupBy (fun (length, _) -> length)
|> Seq.filter (fun (key, value) -> (Seq.length value) > 1)

最好使用 F# 模块中的Seq.groupBy,因为这可以部分应用,代码看起来更流畅和功能强大。

【讨论】:

  • groupBy 很好。如果您需要更好的性能,您可能需要使用 linq toLookup
猜你喜欢
  • 1970-01-01
  • 2018-01-04
  • 2015-01-26
  • 2016-04-10
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多