Как объединить список строк в F #?

Я пытаюсь это сделать в данный момент, но у меня не получилось, что разработанная подпись метода... кто-нибудь? сообщения - это поле seq [string]

let messageString = List.reduce(messages, fun (m1, m2) -> m1 + m2 + Environment.NewLine)

Ответы

Ответ 1

Не то, что вы ищете, но

let strings = [| "one"; "two"; "three" |]
let r = System.String.Concat(strings)
printfn "%s" r

Вы можете сделать

let strings = [ "one"; "two"; "three" ]
let r = strings |> List.fold (+) ""
printfn "%s" r

или

let strings = [ "one"; "two"; "three" ]
let r = strings |> List.fold (fun r s -> r + s + "\n") ""
printfn "%s" r

Ответ 2

> String.concat " " ["Juliet"; "is"; "awesome!"];;
val it : string = "Juliet is awesome!"

Ответ 3

Я бы использовал String.concat, если вам не нужно форматировать более удобное, а затем я бы использовал StringBuilder.

(StringBuilder(), [ "one"; "two"; "three" ])
||> Seq.fold (fun sb str -> sb.AppendFormat("{0}\n", str))

Ответ 4

System.String.Join(Environment.NewLine, List.to_array messages)

или используя вашу складку (обратите внимание, что она намного более неэффективна)

List.reduce (fun a b -> a ^ Environment.NewLine ^ b) messages

Ответ 5

просто еще один комментарий,

когда вы работаете со строкой, вам лучше использовать стандартные строковые функции.

Следующий код предназначен для задачи 40 Эйлера.

let problem40 =
    let str = {1..1000000} |> Seq.map string |> String.concat ""
    let l = [str.[0];str.[9];str.[99];str.[999];str.[9999];str.[99999];str.[999999];]
    l |> List.map (fun x-> (int x) - (int '0')) |> List.fold (*) 1

если вторая строка вышеуказанной программы использует fold вместо concat, она будет чрезвычайно медленной, потому что каждая итерация сложения создает новую длинную строку.