gpt4 book ai didi

f# - 如何在函数式编程(F#)中将行号添加到文本文件?

转载 作者:行者123 更新时间:2023-12-04 17:33:40 26 4
gpt4 key购买 nike

它适用于 for 循环和可变变量:

let addLnNum filename =    
use outFile = new StreamWriter(@"out.txt")
let mutable count = 1
for line in File.ReadLines(filename) do
let newLine = addPre (count.ToString()) line
outFile.WriteLine newLine
count <- count + 1

但它非常“不起作用”,所以我很好奇这样做的正确方法是什么?
我想出了如何将索引号附加到字符串列表中:
let rec addIndex (startInd:int) l=
match l with
|x::xs -> startInd.ToString()+x :: (addIndex (startInd+1) xs)
|[] -> []

但它不适用于 File.ReadLines:
let addLnNum2 filename =    
use outFile = new StreamWriter(@"out.txt")
File.ReadLines(filename)
|> addIndex 1
|> ignore
//Error 1 Type mismatch. Expecting a Collections.Generic.IEnumerable<string> -> 'a
//but given a string list -> string list

将整个文件作为列表读入内存是唯一的方法吗?是否有类似 seq.count 的东西,所以它可以类似于以下内容?
let addLnNum3 filename =    
use outFile = new StreamWriter(@"out.txt")
File.ReadLines(filename)
|> Seq.map (fun s -> Seq.count + s) //no such thing as Seq.count
|> Seq.iter outFile.WriteLine
|> ignore

最佳答案

对于 Seq 中的某些功能模块(与 List 相同,...)您会发现带有附加 i 的版本- 例如 Seq.map你会发现Seq.mapi这就是您要寻找的 - 除了您的集合中的值之外,您还获得(作为第一个参数)索引:

let addLnNums filename =    
use outFile = new System.IO.StreamWriter (@"out.txt")
System.IO.File.ReadLines filename
|> Seq.mapi (sprintf "%d: %s")
|> Seq.iter outFile.WriteLine
另请注意,您不需要 ignoreSeq.iter已经返回 () : unit如果我们没有这个,那么功能性方法将是使用 Zip像这样:
let addLnNum filename =    
use outFile = new System.IO.StreamWriter (@"out.txt")
Seq.zip (Seq.initInfinite id) (System.IO.File.ReadLines filename)
|> Seq.map (fun (index, line) -> sprintf "%d: %s" index line)
|> Seq.iter outFile.WriteLine
其中(除了将函数取消到 map 之外)基本相同

笔记:
对于列表,您显然没有 List.initInfinte ,所以只需使用 Seq - 还有 Seq.zipList.zip对具有不同项目计数的集合有不同的行为 - Seq.zip当一个集合运行尝试但 List.zip 时停止希望两个列表的大小相同,否则将抛出异常

关于f# - 如何在函数式编程(F#)中将行号添加到文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32712278/

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