繁体   English   中英

F#:在F#中使用Enumerable.GroupBy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM