我有一个问题,我很不确定。在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