f# - F#中的列表扁平化

标签 f#

我是 F# 的新手,并试图在 F# 中重写我们的一个应用程序,以便在此过程中尝试学习它,但在展平列表时遇到了一些麻烦。我已经搜索并找到了几个答案,但我似乎无法让它们中的任何一个起作用。

我的数据类型是 val regEntries: RegistryKey list list

我希望它只是一个列表。

下面是我的代码:

namespace DataModule

module RegistryModule =
    open Microsoft.Win32

let regEntries = 
    ["SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"; "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"]
    |> List.map (fun x -> Microsoft.Win32.Registry.LocalMachine.OpenSubKey(x))
    |> List.map(fun k -> List.ofArray(k.GetSubKeyNames()) |> List.map (fun x -> k.OpenSubKey(x)) |> List.filter (fun x -> x.GetValue("ProductId") <> null))

最佳答案

尝试以下

let regEntries = 
    ["SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"; "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"]
    |> Seq.map (fun x -> Microsoft.Win32.Registry.LocalMachine.OpenSubKey(x))
    |> Seq.map(fun k -> 
       (k.GetSubKeyNames()) 
       |> Seq.map (fun x -> k.OpenSubKey(x)) 
       |> Seq.filter (fun x -> x.GetValue("ProductId") <> null)))
    |> Seq.concat
    |> List.ofSeq
Seq.concat方法对于转换 T list list 很有用到 T list .注意我换了很多你的List.调用 Seq.调用。似乎没有必要创建一个实际的 list直到最后,因此我将其保留为一个简单的 seq

关于f# - F#中的列表扁平化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052114/

相关文章:

multithreading - 嵌套循环中的并行代码

f# - 如何在泛型约束类型上调用静态方法

f# - async { ... AsyncAdd ... } 和 async { ... do AsyncAdd ... } 有什么区别?

f# - 类型注解

linq - F# 中的 SingleOrDefault

f# - "if"表达式问题

.net - 模拟ReadAsync

.net - 在 F# 中创建元组

f# - 在 FsUnit F# for XUnit 中断言异常

Excel 前缀公式 F#