Развёртки

Проблема: в LINQ нет развёрток. Можно ли смоделировать их новыми средствами Паскаля? Вот пример.

~$ ghci
...
Prelude> :m Data.List
Prelude Data.List>  let splitN n = unfoldr (\xs -> if null xs then Nothing else Just (take n xs, drop n xs))
Prelude Data.List> splitN 2 "abcde"
["ab","cd","e"]

См. также: справка по unfoldr.

А уточните пожалуйста, что такое Just?

Один из двух конструкторов типа Maybe:

data Maybe a = Nothing | Just a

Собственно, это достаточно странное для Хаскеля место: учитывая, что списки ленивые, можно было бы обойтись и без прокладки в виде Мейби между функцией, дающей один элемент, и алгоритмом развёртки.

Ну, нельзя ли как-то доходчивее объяснить? Может, чуть длиннее? Just (take n xs, drop n xs) - это что - пара? И всё же что делает unfoldr с функцией и стартовым элементом?

С планшета пишу, потому ссылочку приложил на документацию. Собственно, мой вопрос можно сформулировать и более доступно: как в Паскале без циклов, желательно в одну строку, решить задачу разрезания строки на кусочки по n символов (последний кусочек может быть меньше).

Регулярными выражениями в одну строку очень легко такое сделать.

Думаю, как-то так:

begin
  var s := 'abcde';
  SeqWhile(s.AsEnumerable(),v->v.Skip(2),v->v.Count>0).Select(v->v.Take(2)).Print();
end.

Это вряд ли

Попробовал в PABC.NET - действительно, что-то сломалось. Почему-то даже список результатов не могу получить. На первом курсе делали какую-то магию, чтобы работало, а сейчас уже забыл.

@Admin в вашем замечательном описании языка нет SeqWhile. Я смотрю страницу «Функции для работы с последовательностями», там много Seq*, но While нет.

Кстати, с chm всё-таки плох под Линуксом. Видимо, слишком заточенный под винду формат. Получается вот такое:

Содержание почему-то усиленно отображается в cp1252 и никак не переключается.

@sanya_rnd не используются регулярные выражения для таких задач. Если и решить, то это будет извращение по причине того, что базовые регулярные выражения «не умеют считать». А надстройки это уже в определённом смысле костыли.

Ну, вопрос был можно ли one-liner, я предложил такой вариант. По-моему он довольно симпатично выглядит.

Где вы его предложили, можно посмотреть?

На C#:

int n = 4;
string pattern = @"(.{1," + n + "})";
var sp = (from Match match in Regex.Matches(s, pattern) select match.Value).ToList();

оказалось, что развёртки в C# можно смоделировать с помощью yield.