以下是我的代码示例:
let getAllBooks bookDirectory =
seq {yield! Directory.GetFiles(bookDirectory)}
|> Seq.map (fun eachFile -> eachFile.ReadAllBytes)
它无法正常工作。怎么了?我该怎么写呢?
答案 0 :(得分:3)
就像你在标题中所说的那样,该函数被称为File.ReadAllBytes
;)
它是System.IO.File
类的静态方法,因此必须在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
评论更新:
我还有一个问题:如何将字节数组转换为数字等效字符?
您可以使用System.BitConverter
类中的静态方法,例如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。