(コンテキストは私が行列を与えられた行列を転置しようとしています)。
インデックスと要素のセットからリスト(またはリストのリスト)を作成する単純な関数はありません。インデックスが持つすべての値(重複、値の欠落、順序の乱れなど)のために、そのような関数のクリーンでシンプルな定義を行うのは難しいです。
私は欠けているステップは、トリプルのリストを希望の順序にソートすることだと思います。 Listモジュールにはソート関数があるので、これはおそらくあなたの制限によって許されています。
元々、元の順序は最初のインデックスと2番目のインデックスでソートされます。だから、転置を取得するには、2番目のインデックスと1番目のインデックスでソートします。
あなたが正しい順序を決めたら、List.fold_leftまたはList.fold_rightを使ってリストの最終リストを組み立てることができます。
List.fold_leftを使用してリストを3つのグループに再フォーマットする関数です。これは、あなたが欲しい機能はありませんが、それは近いかもしれません:
let bythrees l =
let iby (cur, prev, n) x =
if n mod 3 = 2 then ([], (x :: cur) :: prev, n + 1)
else (x :: cur, prev, n + 1)
in
let (_, res, _) = List.fold_left iby ([], [], 0) l in
res
ここであなたがそれを実行したときに、それがどのように見えるかです:
# bythrees [1;2;3;4;5;6;7;8;9];;
- : int list list = [[9; 8; 7]; [6; 5; 4]; [3; 2; 1]]
出力は、まだいくつかの作業が必要ですが、これはあなたができる示しリストのリストをこのように作成します。
あなたの機能はあなたの言うことをしていないようです。要素を無視してインデックスのリストを作成します。行列に関してあなたが求めていることは明確ではありません。トリプル(index1、index2、element)のリストがあると言っていますか?インデックスが0(つまり)から始まり、密になることを保証していますか?彼らは秩序あるでしょうか? –
@JeffreyScofield私はちょうどそれを修正しました、それはタイプミスでした。私の悪い。そして、はい、私はトリプル(index1、index2、要素)のリストを取得しようとしています。行列を転置しようとする私のアプローチは次のとおりです。1.各要素にフラグを付けるか、それを表す数値をmapiで渡します。2.マトリックスを位置の情報を与えるタプルの大きなリストに集約します3.タプルのリストを繰り返し、行列を改変するために@を使って行列をアセンブルしてください。 – Crowning
数日前に誰かが[リストのリストとして表された行列を転置する方法を尋ねました](http:// stackoverflow。 com/questions/36672807/combined-a-column-of-ocaml)を参照してください。 –