Array-6ren">
gpt4 book ai didi

f# - 在F#: How do I obtain a list of the filenames in a directory; expected unit have string中

转载 作者:行者123 更新时间:2023-12-03 09:53:16 24 4
gpt4 key购买 nike

我只是从F#开始,所以我想尝试一些简单的任务。

这列出了目录中xml文件的完整路径:

System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
|> Array.iter (printfn "%s")

但是我只想要文件名,所以我尝试了:
System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
|> Array.iter (System.IO.Path.GetFileName)
|> (printfn "%s")

这不会编译。它给出了错误:

该表达式应具有类型
单元
但是这里有类型
字符串

我搜索了示例,但找不到任何东西。我显然缺少一些简单而基本的东西,但是呢?

最佳答案

由于您是新手,因此更容易解决错误的一件事就是考虑诸如数学语句之类的语句,这些语句可以由更简单的函数构建,但也可以分解开来。

因此,通过将您的问题分解开来,您可以得到更细粒度的错误,并且变得更容易解决。

System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
|> Array.iter (System.IO.Path.GetFileName)
|> (printfn "%s")

被分解成
let directoryArray = System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
let nameArray = Array.iter (System.IO.Path.GetFileName) directoryArray
(printfn "%s") nameArray

现在错误应该更容易理解

如果我们查看 Array.iter的签名,即 iter : ('T -> unit) -> 'T [] -> unit,我们会看到它需要一个函数 ('T -> unit),该函数接受类型并返回 unit,这意味着不返回任何内容,在这种情况下,可以进行打印,但是您不希望返回任何内容将目录数组转换为文件名数组。因此 Array.iter将不起作用,您需要一个Array函数,该函数将一个函数应用于该数组中的每个项目并返回一个新的 ArrayArray.map会执行此 map : ('T -> 'U) -> 'T [] -> 'U []

同样与 lambda function;可以添加一个lambda函数来传递值。
let directoryArray = System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
let nameArray = Array.map (fun x -> (Path.GetFileName(x))) directoryArray
Array.iter (fun x -> printfn "%s" x) nameArray

现在我们可以使用 (printfn "%s")简化语句
System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
|> Array.map (fun x -> (Path.GetFileName(x)))
|> Array.iter (fun x -> printfn "%s" x)

并通过删除 |>再次简化
open System.IO

Directory.GetFiles("c:\\tmp", "*.xml")
|> Array.map Path.GetFileName
|> Array.iter (printfn "%s")

关于f# - 在F#: How do I obtain a list of the filenames in a directory; expected unit have string中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35481315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com