在 F# 中连接字符串的次数

Concatenating strings in F# number of times

我正在尝试将一个字符串连接一定次数,但我觉得我通过使用高阶函数作弊了一点(或者至少实际上没有理解应该如何完成)功能:

let repeat s n = 
String.replicate n s |> printfn "%s"

repeat "a" 10

显然给了我 "aaaaaaaaaa",但如果没有高阶函数,我怎么能这样做呢?我觉得这是一个非常简单的问题,但我似乎无法解决它,F#语法或思维方式对我来说仍然很麻烦。

如果你只是想要一个递归的解决方案,这个怎么样?

let rec repeat s n =
    match n with
    | _ when n <= 0 -> ""
    | _ -> s + (repeat s (n-1))

repeat "a" 10

或更 "classic" 带有 if 表达式的样式:

let rec repeat s n =
    if n <= 0 then
        ""
    else
        s + (repeat s (n-1))

repeat "a" 10

这是使用列表理解和折叠的一种方法,这是递归的函数:

[for i in 1..10 -> "a"] |> List.fold (+) ""

尾递归版本

let repeat2 s n =
    let rec loop acc n =
        match n with 
        | _ when n > 0 -> loop (acc + s) (n - 1)
        | _ -> acc
    loop "" n

repeat "oijdfsaoijdoyasjd" 100000 // Process is terminated due to WhosebugException.
[for i in 1..100000 -> "oijdfsaoijdoyasjd"] |> List.fold (+) "" // no stack overflow
repeat2 "oijdfsaoijdoyasjd"  100000 // no stack overflow

但是为大量的 gen2 GC 和几分钟做好了准备。运行时间。