2012-02-02 85 views
1

我有一个问题,我很不确定。在F中乘以一个字符串#

我的问题是如下

let myFunc (text:string) (times:int) = .... 

我想要的这个功能做的就是把串起来多次被times参数指定。

if input = "check " 3我想要的输出字符串= "check check check"

我试图与一个循环,但也似乎不能使它发挥作用。

有人吗?

+3

请[接受](HTTP://元.stackexchange.com/questions/5234 /)一个答案,如果它对你有帮助。 – pad 2012-02-03 16:34:20

回答

12

其实功能已经在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() 

如果你想在删除尾部空格您例如,您可以使用String类中的Trim()成员来完成此操作。

+0

该死的,没有通知,感谢哥们! – user1090614 2012-02-02 12:58:07

+0

你已经实现了'fold'。 – Daniel 2012-02-02 16:58:46

+0

更像是'iter',因为每一步都不会创建一个新的'StringBuilder'。 – pad 2012-02-02 17:06:49

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" 

否则你应该遵循关于标准F#库函数replicate的指针pad的答案。

2

焊盘上的解决方案,因为它只是一个折叠的变化:

let multiply n (text: string) = 
    (StringBuilder(), {1..n}) 
    ||> Seq.fold(fun b _ -> b.Append(text)) 
    |> sprintf "%O" 
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 
0

在一个简单的递归方式:

let rec dupn = function 
|s,1 -> s 
|s,n -> s^dupn(s, n-1)