我正在尝试将字符串连接一定次数,但我觉得我已经通过使用更高阶函数欺骗了一点(或者至少没有真正理解它应该如何完成):
let repeat s n =
String.replicate n s |> printfn "%s"
repeat "a" 10
显然给了我“aaaaaaaaaa”,但是如果没有高阶函数我怎么能这样做呢?我觉得这是一个非常简单的问题,但我似乎无法绕过它,F#语法或思维方式对我来说仍然很麻烦。
答案 0 :(得分:3)
如果您只想要一个递归解决方案,那该怎么样?
let rec repeat s n =
match n with
| _ when n <= 0 -> ""
| _ -> s + (repeat s (n-1))
repeat "a" 10
或带有if-expression的更“经典”风格:
let rec repeat s n =
if n <= 0 then
""
else
s + (repeat s (n-1))
repeat "a" 10
答案 1 :(得分:2)
这里有一种使用list comprehension和fold的方法,这是递归函数:
[for i in 1..10 -> "a"] |> List.fold (+) ""
Tail Recursive version
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 StackOverflowException.
[for i in 1..100000 -> "oijdfsaoijdoyasjd"] |> List.fold (+) "" // no stack overflow
repeat2 "oijdfsaoijdoyasjd" 100000 // no stack overflow
但是为大量的gen2 GC准备了几分钟。运行时