在 F# 中调用 File.ReadAllBytes 方法

Calling the File.ReadAllBytes method in F#

这是我的代码示例:

let getAllBooks bookDirectory =
    seq {yield! Directory.GetFiles(bookDirectory)}
    |> Seq.map (fun eachFile -> eachFile.ReadAllBytes)

无法正常工作。怎么了?我应该写什么?

正如你在标题中所说,函数被调用File.ReadAllBytes ;)

它是 System.IO.File class 的静态方法,因此必须在 File 类型上调用,而不是某些实例:

open System.IO

let getAllBooks bookDirectory =
    seq {yield! Directory.GetFiles (bookDirectory) }
    |> Seq.map (fun eachFile -> File.ReadAllBytes eachFile)

顺便说一下,这段代码可以改进,因为 GetFiles 的结果是一个数组,它也是一个 seq:

open System.IO

let getAllBooks bookDirectory =
    Directory.GetFiles bookDirectory
    |> Seq.map (fun eachFile -> File.ReadAllBytes eachFile)

此外,您可以直接将 ReadAllBytes 函数传递给 map:

open System.IO

let getAllBooks bookDirectory =
    Directory.GetFiles bookDirectory
    |> Seq.map File.ReadAllBytes

最后,如果你愿意,你也可以去掉函数参数:

open System.IO

let getAllBooks =
    Directory.GetFiles
    >> Seq.map File.ReadAllBytes

评论更新:

I have an additional question: How may I convert a byte array into its numeric equivalent?

您可以使用 System.BitConverter class 中的静态方法,例如 System.BitConverter.ToInt32:

open System

let array = [| 0x00uy; 0x10uy; 0x00uy; 0x00uy |]

BitConverter.ToInt32 (array, 0)
|> printfn "Array as Int32: %d"
// Prints: Array as Int32: 4096

不要忽视里面的ToString方法,它可以将字节数组转换为十六进制字符串:

BitConverter.ToString array
|> printfn "%s"
// Prints: 00-10-00-00

可以找到所有可用的转换方法on MSDN