2012-02-02 3 views
1

나는 다소 확신이 없다. 나는 times 매개 변수에 의해 지정된대로 할 수있는이 기능은 여러 번 함께 문자열을 넣어 원하는 것은F #에서 문자열 곱하기

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

을 다음과 같이

내 질문입니다.

if input = "check " 3 나는 출력 문자열 = "check check check"

나는 루프 시도하지만 그것이 작동되도록하는 것 같지 수를 원한다.

누구나?

+3

[동의]하십시오 (HTTP : // 메타 .stackexchange.com/questions/5234 /) 도움이 될만한 답변. – pad

답변

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

+0

'fold'를 구현했습니다. – Daniel

+0

각 단계가 새로운'StringBuilder'를 생성하지 않기 때문에'iter'와 더 비슷합니다. – pad

2

당신이 원하는 경우 순수 기능 "할 - 그것 - 스스로"F # 학습 목적을위한 버전은 다음 조각 같은 것을 할 것입니다 :

> myFunc 3 "test";; 
val it : string = "testtesttest" 
: 여기
let myFunc times text = 
    let rec grow result doMore = 
     if doMore > 0 then 
      grow (result + text) (doMore- 1) 
     else 
      result 
    grow "" times 

테스트입니다

그렇지 않으면 패드의 답에 주어진 표준 F # 라이브러리 함수에 대한 포인터를 따라야합니다.

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)