在F#中乘以一个字符串

时间:2012-02-02 12:41:50

标签: string f#

我有一个我不太确定的问题。

我的问题如下

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

我希望这个函数做的是将字符串放在times参数指定的次数上。

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

我尝试过循环,但似乎无法使其正常工作。

任何?

5 个答案:

答案 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)