スターティングリストがあるとしましょう
let test = [1; 2; 3; 4; 5]
そして、最初の要素を他のすべての要素に追加し、次に2番目の要素を他のすべての要素に追加し、というように、次のような結果になるまで続けます。
result = [1, [3; 4; 5; 6];
2, [3; 5; 6; 7];
3, [4; 5; 7; 8];
4, [5; 6; 7; 9];
5, [6; 7; 8; 9]]
私の人生では、List.n
ここでどの方法が適切であるか、あるいはそれが存在するかどうかさえわかりません。私はそれList.map
がそれをしないことを知っています、そして私はそれをしないか、List.reduce
またはそうList.fold
するつもりはありません、なぜならそれらは両方とも個々の機能ではなくアキュムレータであるからです。
私がやろうとしていることをする方法はありますか?
ご協力いただきありがとうございます
List
モジュールには簡単に使用できる直接関数はないと思いますが、時々便利で、自分で簡単に定義できる関数があります。
let rec pick xs =
match xs with
| [] -> []
| (x::xs) -> (x,xs) :: (List.map (fun (x',xs') -> (x',x::xs')) (pick xs))
これはタプルを生成し、最初のコンポーネントはリストの1つの値であり、2番目のコンポーネントはリストの残りの値です。
pick [1..5] =
[(1, [2; 3; 4; 5])
;(2, [1; 3; 4; 5])
;(3, [1; 2; 4; 5])
;(4, [1; 2; 3; 5])
;(5, [1; 2; 3; 4])]
これであなたが望むことをするのは難しくありません:
let f xs =
List.map (fun (x,xs) -> (x, List.map (fun y -> y+x) xs))
(pick xs)
> f [1;2;3;4;5];;
[(1, [3; 4; 5; 6])
;(2, [3; 5; 6; 7])
;(3, [4; 5; 7; 8])
;(4, [5; 6; 7; 9])
;(5, [6; 7; 8; 9])]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加