我有一个我不太确定的问题。
我的问题如下
let myFunc (text:string) (times:int) = ....
我希望这个函数做的是将字符串放在times
参数指定的次数上。
if input = "check " 3
我想要输出字符串= "check check check"
我尝试过循环,但似乎无法使其正常工作。
任何?
答案 0 :(得分:14)
实际上该功能已经在String模块中:
let multiply text times = String.replicate times text
要编写自己的函数,一种有效的方法是使用StringBuilder
:
open System.Text
let multiply (text: string) times =
let sb = new StringBuilder()
for i in 1..times do
sb.Append(text) |> ignore
sb.ToString()
如果要删除示例中的尾随空格,可以使用Trim()
类中的String
成员来执行此操作。
答案 1 :(得分:2)
如果你想要一个纯粹的功能性“自己动手”版本用于F#学习目的,那么类似下面的代码片段会做:
let myFunc times text =
let rec grow result doMore =
if doMore > 0 then
grow (result + text) (doMore- 1)
else
result
grow "" times
以下是测试:
> myFunc 3 "test";;
val it : string = "testtesttest"
否则你应该按照 pad 答案中给出的关于标准F#库函数replicate
的指针。
答案 2 :(得分:2)
pad的解决方案的变体,因为它只是一个折叠:
let multiply n (text: string) =
(StringBuilder(), {1..n})
||> Seq.fold(fun b _ -> b.Append(text))
|> sprintf "%O"
答案 3 :(得分:1)
String.replicate
已经提供了您正在寻找的功能。
如果由于某种原因你想要反转参数,你可以按如下方式进行:
(* A general function you should add to your utilities *)
let flip f a b = f b a
let myFunc = flip String.replicate
答案 4 :(得分:0)
以简单的递归方式:
let rec dupn = function
|s,1 -> s
|s,n -> s ^ dupn(s, n-1)