Тот, который я знаю как лучший, это FPDF . Это отличное решение с открытым исходным кодом для создания всех видов макетов PDF. Спасибо
Поскольку [[1,5,10]
не является допустимым списком, я предполагаю, что вы имеете в виду [[1,5,10]]
, то есть список int list . Вы можете создать такой список просто, как только что сделали: [[1,5,10]]
. Выполнение этого для произвольного списка int может быть выполнено следующим образом:
fun singleton (xs : int list) = [xs]
val test_1 = singleton [1,5,10] (* = [[1,5,10]] *)
Конкатенация не произошла, поскольку это синонимично:
- [1,5,10] :: [];
> val it = [[1, 5, 10]] : int list list
То есть список [1,5,10]
перед пустым списком.
Это демонстрирует оператор ::
(cons). Если вы когда-либо хотите поместить несколько элементов (например, несколько int list s) друг перед другом, это то, что вы называете конкатенацией, и вы используете оператор @
(добавление), например, например:
- [1,5,10] @ [11,15,20]
> val it = [1, 5, 10, 11, 15, 20] : int list
Наконец, есть оператор List.concat
, который берет список списков и добавляет их все:
- List.concat [ [1,2,3], [4,5,6], [7,8,9] ];
> val it = [1, 2, 3, 4, 5, 6, 7, 8, 9] : int list
Хорошее упражнение на этом этапе чтобы определить эту рекурсивную функцию:
fun my_concat [] = ...
| my_concat (xs :: xss) = ...
где xs
- первый список в списке списков, а xss
- оставшийся список списков.
(Я попытался выделить это, дав xs
имя во множественном числе и xss
имя во множественном числе.)