我有一個問題,我很不確定。在F中乘以一個字符串#
我的問題是如下
let myFunc (text:string) (times:int) = ....
我想要的這個功能做的就是把串起來多次被times
參數指定。
if input = "check " 3
我想要的輸出字符串= "check check check"
我試圖與一個循環,但也似乎不能使它發揮作用。
有人嗎?
我有一個問題,我很不確定。在F中乘以一個字符串#
我的問題是如下
let myFunc (text:string) (times:int) = ....
我想要的這個功能做的就是把串起來多次被times
參數指定。
if input = "check " 3
我想要的輸出字符串= "check check check"
我試圖與一個循環,但也似乎不能使它發揮作用。
有人嗎?
其實功能已經在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()
成員來完成此操作。
該死的,沒有通知,感謝哥們! – user1090614 2012-02-02 12:58:07
你已經實現了'fold'。 – Daniel 2012-02-02 16:58:46
更像是'iter',因爲每一步都不會創建一個新的'StringBuilder'。 – pad 2012-02-02 17:06:49
如果你想要一個純粹的功能性「做自己動手」版本的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的答案。
焊盤上的解決方案,因爲它只是一個摺疊的變化:
let multiply n (text: string) =
(StringBuilder(), {1..n})
||> Seq.fold(fun b _ -> b.Append(text))
|> sprintf "%O"
String.replicate
已經提供你正在尋找的功能。
如果由於某種原因你想要的論點相反,你可以如下做到這一點:
(* A general function you should add to your utilities *)
let flip f a b = f b a
let myFunc = flip String.replicate
在一個簡單的遞歸方式:
let rec dupn = function
|s,1 -> s
|s,n -> s^dupn(s, n-1)
請[接受](HTTP://元.stackexchange.com/questions/5234 /)一個答案,如果它對你有幫助。 – pad 2012-02-03 16:34:20