Умножение строки в F # - PullRequest
       3

Умножение строки в F #

3 голосов
/ 02 февраля 2012

У меня есть вопрос, в котором я не совсем уверен.

У меня следующие вопросы

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

Я хочу, чтобы эта функция собирала строку столько раз, сколько указано параметром times.

if input = "check " 3 Я хочу, чтобы выходная строка = "check check check"

Я пробовал с циклом, но не могу заставить его работать.

Любой

Ответы [ 5 ]

14 голосов
/ 02 февраля 2012

На самом деле функция уже находится в String module:

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 классе, чтобы сделать это.

2 голосов
/ 02 февраля 2012

Вариант решения пэда, учитывая, что это всего лишь фолд:

let multiply n (text: string) = 
  (StringBuilder(), {1..n})
  ||> Seq.fold(fun b _ -> b.Append(text))
  |> sprintf "%O"
2 голосов
/ 02 февраля 2012

Если вам нужна чисто функциональная версия «сделай сам» для изучения 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, указанной в ответе пэда.

1 голос
/ 04 февраля 2012

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 голосов
/ 30 января 2018

Простым рекурсивным способом:

let rec dupn = function
|s,1 -> s
|s,n -> s ^ dupn(s, n-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...