2012-02-02 39 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) 
相關問題