Я всегда считаю целесообразным разбить проблему на куски размером в байты, которые можно объединить для формирования решения. Вы хотите дополнить или усечь списки до заданной длины; это легко сделать в два шага, сначала pad, а затем усечь:
let all x = let rec xs = x :: xs in xs
let rec take n = function
| [] -> []
| _ when n = 0 -> []
| x :: xs -> x :: take (pred n) xs
all
создает бесконечный список путем повторения значения, в то время как take
извлекает подсписок префиксов не более заданной длины. С этими двумя, заполнение и усечение очень просты:
let pad_trim e n l = take n (l @ all e)
(может быть немного удивительно, что на самом деле это работает на строгом языке, таком как OCaml). С этим определением ваша необходимая функция просто:
let mapfn elem list1 list2 = List.map2 (pad_trim elem) list2 list1
то есть, принимая второй список в качестве списка заданных длин, дополняет каждый из списков в первом списке этой длиной с помощью поставляемого элемента заполнения. Например, mapfn 42 [[];[];[]] [1;2;3]
дает [[42]; [42; 42]; [42; 42; 42]]
. Если это не то, что вам нужно, вы можете настроить детали и их сборку в соответствии с вашими требованиями.