Я бы хотел перенести вложенный список ('a list list
) в F #. Проблема в том, что я не хочу использовать рекурсию.
Однако я обнаружил, что для того, чтобы не использовать рекурсию, я должен использовать изменяемые списки. На мой взгляд, это немного проблематично. Тем не менее, я попытался реализовать его с помощью цикла for и двух изменяемых списков:
let transpose (llst : 'a list list) : 'a list list =
let mutable lst = llst
let mutable result = [List.map List.head lst]
for i = 1 to lst.Length do
lst <- List.map List.tail lst
result <- List.append result [List.map List.head lst]
result
Более того, я старался избегать этого. Я знаю изменчивость массивов, поэтому я попытался решить эту проблему путем преобразования из 'a list list
в 2darray ([,]
), однако при попытке преобразовать результат обратно во вложенный список происходит сбой, так как List.ofArray
работает только с одномерными массивами:
let transpose (llst : 'a list list) : 'a list list = [List.ofArray (Array2D.init (llst.ToArray.GetLength 1) (llst.ToArray.GetLength 0) (fun x y -> llst.ToArray.[y,x]))]
Первый код работает, но я бы хотел более простую реализацию без циклов for или изменяемых списков. Второй код не работает, так как функция List.ofArray
работает только с []
, а не [,]
.
Я также пытался с
List.init (llst.[0].Length) (List.forall (fun SOMETHING) llst)
Где SOMETHING
будет включать функцию, которая принимает первый столбец обоих подсписков, а затем отбрасывает первый столбец. (List.map List.head и List.map List.tail). Может быть с использованием List.map
?