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)
折叠可能不是执行此任务的最佳方法.它更容易映射和连接像这样:
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)
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |