F#Basics:Folding 2列在一起成为一个字符串

evi*_*red 5 f# functional-programming

从我的Scheme日期开始有点生疏,我想拿两个列表:一个数字和一个字符串,然后将它们折叠成一个单独的字符串,其中每一对都写成"{(ushort)5",bla bla bla "},\n".我有大部分内容,我只是不确定如何正确编写折叠:

let splitter = [|","|]
let indexes = 
  indexStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList 
let values = 
  valueStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList

let pairs = List.zip indexes values
printfn "%A" pairs

let result = pairs |> Seq.fold
    (fun acc a -> String.Format("{0}, \{(ushort){1}, \"{2}\"\}\n", 
                                acc, (List.nth a 0), (List.nth a 1)))
Run Code Online (Sandbox Code Playgroud)

gra*_*bot 10

你遗漏了两件事.折叠的初始状态是一个空字符串,你不能在F#中的元组上使用列表理解.

let splitter = [|","|]
let indexes = 
    indexStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList 
let values = 
    valueStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList

let pairs = List.zip indexes values
printfn "%A" pairs

let result = 
    pairs 
    |> Seq.fold (fun acc (index, value) -> 
        String.Format("{0}{{(ushort){1}, \"{2}\"}},\n", acc, index, value)) ""
Run Code Online (Sandbox Code Playgroud)

fold2版本

let result = 
    List.fold2 
        (fun acc index value -> 
            String.Format("{0}{{(ushort){1}, \"{2}\"}},\n", acc, index, value))
        "" 
        indexes 
        values
Run Code Online (Sandbox Code Playgroud)

如果您关注速度,可能需要使用字符串构建器,因为每次附加时它都不会创建新字符串.

let result = 
    List.fold2 
        (fun (sb:StringBuilder) index value -> 
            sb.AppendFormat("{{(ushort){0}, \"{1}\"}},\n", index, value)) 
        (StringBuilder()) 
        indexes 
        values
    |> string
Run Code Online (Sandbox Code Playgroud)


Jul*_*iet 8

折叠可能不是执行此任务的最佳方法.它更容易映射和连接像这样:

let l1 = "a,b,c,d,e".Split([|','|])
let l2 = "1,2,3,4,5".Split([|','|])
let pairs =
    Seq.zip l1 l2
    |> Seq.map (fun (x, y) -> sprintf "(ushort)%s, \"%s\"" x y)
    |> String.concat "\n"
Run Code Online (Sandbox Code Playgroud)