У меня есть строка, которую я хочу разбить на массив подстрок заданной длины n. Меня не интересует остаток (если длину строки нельзя разделить на n без остатка)
let ChopString (myString : string) n =
let res =
seq{
for i = 0 to myString.Length / n - 1 do
yield( String.sub myString (i*n) n )
}
|> Seq.to_array
res
Это лучшее, что я мог сделать. Мне это кажется некрасивым.
Есть ли более приятная / более короткая версия этого, может быть, без цикла?
Нет, я просто хочу разбить строку на подстроки заданной длины, начиная с начала строки - не обращаю внимания на содержимое, не обращаю внимания на остаток, который короче заданной длины подстроки





stringInstance.[start..end] намного читабельнее, чем String.sub. Вот что я придумал:
let chop (input : string) len =
seq { for start in 0 .. len .. input.Length - 1
do yield input.[start..start + len - 1] }
|> Seq.toArray
Или вы можете использовать:
let chop (input : string) len =
Array.init (input.Length / len) (fun index ->
let start = index * len
input.[start..start + len - 1])
Мне больше нравится второй, без цикла, без выхода, функция для инициализации. Хотя вмешательство на моем примере тоже приятно - выглядит более читабельным.
Крейг Стунц оставил здесь ответ, который сейчас отсутствует. Во всяком случае, он указал на статья о F#, у которых есть две функции для обработки строк: explode и implode. Эти две функции взяты из стандартной библиотеки ML. Вот код:
let rec explode str =
let len = String.length str in
if len=0 then [] else
(String.sub str 0 1) :: explode (String.sub str 1 (len-1))
let rec implode lst = match lst with
[] -> ""
| x1 :: x2 -> x1 ^ implode x2
explode преобразует строку в список строк, каждая из которых состоит из одного символа.
implode делает обратное - объединяет список строк в одну строку.
Обе функции рекурсивны, поэтому было бы интересно сравнить производительность.
Вам нужно красиво нарушить границы слов? Судя по вашему образцу кода, я бы предположил «нет», но я хочу быть уверенным.