F#-配列
配列は、すべて同じタイプの連続するデータ要素の固定サイズのゼロベースの可変コレクションです。
配列の作成
さまざまな構文と方法を使用するか、配列モジュールの関数を使用して、配列を作成できます。このセクションでは、モジュール関数を使用せずに配列を作成する方法について説明します。
関数なしで配列を作成する構文上の方法は3つあります-
- [|の間の連続する値をリストすることによって および|]セミコロンで区切ります。
- 各要素を別々の行に配置する。この場合、セミコロン区切り文字はオプションです。
- シーケンス式を使用する。
ドット演算子(。)と角かっこ([および])を使用して、配列要素にアクセスできます。
次の例は、配列の作成を示しています-
//using semicolon separator
let array1 = [| 1; 2; 3; 4; 5; 6 |]
for i in 0 .. array1.Length - 1 do
printf "%d " array1.[i]
printfn" "
// without semicolon separator
let array2 =
[|
1
2
3
4
5
|]
for i in 0 .. array2.Length - 1 do
printf "%d " array2.[i]
printfn" "
//using sequence
let array3 = [| for i in 1 .. 10 -> i * i |]
for i in 0 .. array3.Length - 1 do
printf "%d " array3.[i]
printfn" "
プログラムをコンパイルして実行すると、次の出力が得られます。
1 2 3 4 5 6
1 2 3 4 5
1 4 9 16 25 36 49 64 81 100
配列の基本操作
ライブラリモジュールMicrosoft.FSharp.Collections.Arrayは、1次元配列の操作をサポートしています。
次の表に、配列の基本的な操作を示します。
値 | 説明 |
---|---|
追加: 'T []→' T []→ 'T [] | ある配列の要素とそれに続く別の配列の要素を含む配列を作成します。 |
平均:^ T []→^ T | 配列内の要素の平均を返します。 |
averageBy :( 'T→^ U)→' T []→^ U | 配列の各要素に関数を適用することによって生成された要素の平均を返します。 |
blit: 'T []→int→' T []→int→int→unit | ある配列から要素の範囲を読み取り、それらを別の配列に書き込みます。 |
選択:( 'T→Uオプション)→' T []→ 'U [] | 提供された関数を配列の各要素に適用します。関数がSome(x)を返す各要素の結果xを含む配列を返します。 |
収集:( 'T→' U [])→T []→ 'U [] | 提供された関数を配列の各要素に適用し、結果を連結して、結合された配列を返します。 |
concat:seq <'T []>→' T [] | 提供された配列の各シーケンスの要素を含む配列を作成します。 |
コピー: 'T→' T [] | 指定された配列の要素を含む配列を作成します。 |
create:int→ 'T→' T [] | 要素がすべて最初に指定された値である配列を作成します。 |
空: 'T [] | 指定されたタイプの空の配列を返します。 |
存在する:( 'T→bool)→' T []→bool | 配列のいずれかの要素が指定された述語を満たすかどうかをテストします。 |
存在2 :( 'T1→' T2→bool)→ 'T1 []→' T2 []→bool | 2つの配列の対応する要素のいずれかのペアが、指定された条件を満たすかどうかをテストします。 |
塗りつぶし: 'T []→int→int→' T→unit | 配列の要素の範囲を指定された値で埋めます。 |
フィルタ:( 'T→bool)→' T []→ 'T [] | 指定された条件が返す指定された配列の要素のみを含むコレクションを返します true。 |
検索:( 'T→bool)→' T []→ 'T | 指定された関数が返す最初の要素を返します true。そのような要素が存在しない場合、KeyNotFoundExceptionを発生させます。 |
findIndex :( 'T→bool)→' T []→int | 指定された条件を満たす配列の最初の要素のインデックスを返します。どの要素も条件を満たさない場合、KeyNotFoundExceptionを発生させます。 |
fold :( '状態→' T→ '状態)→'状態→ 'T []→'状態 | 配列の各要素に関数を適用し、計算を通じてアキュムレータ引数をスレッド化します。入力関数がfで、配列要素がi0 ... iNの場合、この関数はf(...(fs i0)...)iNを計算します。 |
fold2 :( '状態→' T1→ 'T2→'状態)→ '状態→' T1 []→ 'T2 []→'状態 | 提供された2つの配列の要素のペアに関数を左から右に適用し、計算を通じてアキュムレータ引数をスレッド化します。2つの入力配列の長さは同じである必要があります。それ以外の場合、ArgumentExceptionが発生します。 |
foldBack :( 'T→'状態→ '状態)→' T []→ '状態→'状態 | 配列の各要素に関数を適用し、計算を通じてアキュムレータ引数をスレッド化します。入力関数がfで、配列要素がi0 ... iNの場合、この関数はf i0(...(f iN s))を計算します。 |
foldBack2 :( 'T1→' T2→ '状態→'状態)→ 'T1 []→' T2 []→ '状態→'状態 | 提供された2つの配列の要素のペアに関数を右から左に適用し、計算を通じてアキュムレータ引数をスレッド化します。2つの入力配列の長さは同じである必要があります。それ以外の場合、ArgumentExceptionが発生します。 |
forall :( 'T→bool)→' T []→bool | 配列のすべての要素が指定された条件を満たすかどうかをテストします。 |
forall2 :( 'T1→' T2→bool)→ 'T1 []→' T2 []→bool | 提供された2つの配列の対応するすべての要素が、提供された条件を満たすかどうかをテストします。 |
get: 'T []→int→' T | 配列から要素を取得します。 |
init:int→(int→ 'T)→' T [] | 提供された関数を使用して、提供された次元の配列を作成します。 |
isEmpty: 'T []→bool | 配列に要素があるかどうかをテストします。 |
iter :( 'T→ユニット)→' T []→ユニット | 提供された関数を配列の各要素に適用します。 |
iter2 :( 'T1→' T2→単位)→ 'T1 []→' T2 []→単位) | 提供された関数を、2つの配列の一致するインデックスからの要素のペアに適用します。2つの配列の長さは同じである必要があります。それ以外の場合、ArgumentExceptionが発生します。 |
iteri:(int→ 'T→unit)→' T []→unit | 提供された関数を配列の各要素に適用します。関数に渡される整数は、要素のインデックスを示します。 |
iteri2:(int→ 'T1→' T2→unit)→ 'T1 []→' T2 []→unit | 提供された関数を、2つの配列の一致するインデックスから要素のペアに適用し、要素のインデックスも渡します。2つの配列の長さは同じである必要があります。それ以外の場合は、ArgumentExceptionが発生します。 |
長さ: 'T []→int | 配列の長さを返します。Lengthプロパティは同じことをします。 |
マップ:( 'T→' U)→ 'T []→' U [] | 提供された配列の各要素に提供された関数を適用した結果である要素を持つ配列を作成します。 |
map2 :( 'T1→' T2→ 'U)→' T1 []→ 'T2 []→' U [] | 提供された関数を2つの提供された配列の対応する要素に適用した結果である要素を持つ配列を作成します。2つの入力配列の長さは同じである必要があります。それ以外の場合、ArgumentExceptionが発生します。 |
mapi:(int→ 'T→' U)→ 'T []→' U [] | 提供された配列の各要素に提供された関数を適用した結果である要素を持つ配列を作成します。関数に渡される整数インデックスは、変換される要素のインデックスを示します。 |
mapi2:(int→ 'T1→' T2→ 'U)→' T1 []→ 'T2 []→' U [] | 提供された関数を2つのコレクションの対応する要素にペアごとに適用した結果である要素を持つ配列を作成し、要素のインデックスも渡します。2つの入力配列の長さは同じである必要があります。それ以外の場合、ArgumentExceptionが発生します。 |
最大: 'T []→' T | 配列のすべての要素の中で最大のものを返します。Operators.maxは、要素を比較するために使用されます。 |
maxBy :( 'T→' U)→ 'T []→' T | 関数の結果でOperators.maxを介して比較された、配列のすべての要素の最大値を返します。 |
分:( 'T []→' T | 配列のすべての要素の最小値を返します。Operators.minは、要素を比較するために使用されます。 |
minBy :( 'T→' U)→ 'T []→' T | 配列のすべての要素の最小値を返します。Operators.minは、要素を比較するために使用されます。 |
ofList: 'Tリスト→' T [] | 指定されたリストから配列を作成します。 |
ofSeq:seq <'T>→' T [] | 指定された列挙可能なオブジェクトから配列を作成します。 |
パーティション:( 'T→bool)→' T []→ 'T [] *' T [] | 配列を2つの配列に分割します。1つには、指定された条件が返す要素が含まれます。 true, そしてそれが返すものを含む他のもの false。 |
順列:(int→int)→ 'T []→' T [] | 指定された順列に従って配列の要素を並べ替えます。 |
ピック:( 'T→' Uオプション)→ 'T []→' U | 指定された関数を指定された配列の連続する要素に適用し、関数がいくつかのxに対してSome(x)を返す最初の結果を返します。関数がSome(x)を返さない場合、KeyNotFoundExceptionが発生します。 |
削減:( 'T→' T→ 'T)→' T []→ 'T | 配列の各要素に関数を適用し、計算を通じてアキュムレータ引数をスレッド化します。入力関数がfで、配列要素がi0 ... iNの場合、この関数はf(...(f i0 i1)...)iNを計算します。配列のサイズがゼロの場合、ArgumentExceptionが発生します。 |
reduceBack :( 'T→' T→ 'T)→' T []→ 'T | 配列の各要素に関数を適用し、計算を通じてアキュムレータ引数をスレッド化します。入力関数がfで、要素がi0 ... iNの場合、この関数はf i0(...(f iN-1 iN))を計算します。配列のサイズがゼロの場合、ArgumentExceptionが発生します。 |
rev: 'T []→' T [] | 指定された配列内の要素の順序を逆にします。 |
スキャン:( '状態→' T→ '状態)→'状態→ 'T []→'状態[]) | foldのように動作しますが、中間結果と最終結果を返します。 |
scanBack :( 'T→'状態→ '状態)→' T []→ '状態→'状態[] | foldBackのように動作しますが、中間結果と最終結果を返します。 |
セット: 'T []→int→' T→unit | 配列の要素を設定します。 |
並べ替え: 'T []→' T [] | 配列の要素を並べ替えて、新しい配列を返します。Operators.compareは、要素を比較するために使用されます。 |
sortBy :( 'T→'キー)→ 'T []→' T [] | 提供されている関数を使用して配列の要素を並べ替え、要素を並べ替え操作の基になる型に変換し、新しい配列を返します。Operators.compareは、要素を比較するために使用されます。 |
sortInPlace: 'T []→ユニット | 提供されている比較関数を使用して、配列を所定の位置に変更することにより、配列の要素を並べ替えます。Operators.compareは、要素を比較するために使用されます。 |
sortInPlaceBy :( 'T→'キー)→ 'T []→ユニット | 提供されているキーの射影を使用して、配列を所定の位置に変更することにより、配列の要素を並べ替えます。Operators.compareは、要素を比較するために使用されます。 |
sortInPlaceWith :( 'T→' T→int)→ 'T []→unit | 提供されている比較関数を使用して配列の要素を並べ替え、配列を所定の位置に変更します。 |
sortWith :( 'T→' T→int)→ 'T []→' T [] | 提供されている比較関数を使用して配列の要素を並べ替え、新しい配列を返します。 |
sub: 'T []→int→int→' T [] | 開始インデックスと長さで指定された、指定されたサブ範囲を含む配列を作成します。 |
合計: 'T []→^ T | 配列内の要素の合計を返します。 |
sumBy :( 'T→^ U)→' T []→^ U | 配列の各要素に関数を適用して生成された結果の合計を返します。 |
toList: 'T []→' Tリスト | 指定された配列をリストに変換します。 |
toSeq: 'T []→seq <' T> | 指定された配列をシーケンスとして表示します。 |
tryFind :( 'T→bool)→' T []→ 'Tオプション | 指定された関数が返す、指定された配列の最初の要素を返します true。戻り値None そのような要素が存在しない場合。 |
tryFindIndex :( 'T→bool)→' T []→intオプション | 指定された条件を満たす配列の最初の要素のインデックスを返します。 |
tryPick :( 'T→' Uオプション)→ 'T []→' Uオプション | 指定された関数を指定された配列の連続する要素に適用し、関数がいくつかのxに対してSome(x)を返す最初の結果を返します。関数がSome(x)を返さない場合は、None が返されます。 |
解凍:( 'T1 *' T2)[]→ 'T1 [] *' T2 [] | タプルペアの配列を2つの配列のタプルに分割します。 |
unzip3 :( 'T1 *' T2 * 'T3)[]→' T1 [] * 'T2 [] *' T3 [] | 3つの要素のタプルの配列を3つの配列のタプルに分割します。 |
zeroCreate:int→ 'T [] | 要素が最初にデフォルト値Unchecked.defaultof <'T>に設定されている配列を作成します。 |
zip: 'T1 []→' T2 []→( 'T1 *' T2)[] | 2つの配列を、2つの要素を持つタプルの配列に結合します。2つの配列の長さは同じである必要があります。それ以外の場合、ArgumentExceptionが発生します。 |
zip3: 'T1 []→' T2 []→ 'T3 []→(' T1 * 'T2 * 113' T3)[] | 3つの配列を、3つの要素を持つタプルの配列に結合します。3つの配列の長さは同じでなければなりません。それ以外の場合、ArgumentExceptionが発生します。 |
次のセクションでは、これらの機能のいくつかの使用法を見ていきます。
関数を使用した配列の作成
配列モジュールは、配列を最初から作成するいくつかの関数を提供します。
ザ・ Array.empty 関数は新しい空の配列を作成します。
ザ・ Array.create 関数は、指定されたサイズの配列を作成し、すべての要素を指定された値に設定します。
ザ・ Array.init 関数は、要素を生成するための次元と関数を指定して、配列を作成します。
ザ・ Array.zeroCreate 関数は、すべての要素がゼロ値に初期化される配列を作成します。
ザ・ Array.copy 関数は、既存の配列からコピーされた要素を含む新しい配列を作成します。
ザ・ Array.sub 関数は、配列のサブ範囲から新しい配列を生成します。
ザ・ Array.append 関数は、2つの既存の配列を組み合わせて新しい配列を作成します。
ザ・ Array.choose 関数は、新しい配列に含める配列の要素を選択します。
ザ・ Array.collect 関数は、既存の配列の各配列要素で指定された関数を実行し、関数によって生成された要素を収集して、それらを新しい配列に結合します。
ザ・ Array.concat 関数は配列のシーケンスを受け取り、それらを1つの配列に結合します。
ザ・ Array.filter functionはブール条件関数を受け取り、条件が真である入力配列からの要素のみを含む新しい配列を生成します。
ザ・ Array.rev 関数は、既存の配列の順序を逆にすることによって新しい配列を生成します。
次の例は、これらの機能を示しています-
例1
(* using create and set *)
let array1 = Array.create 10 ""
for i in 0 .. array1.Length - 1 do
Array.set array1 i (i.ToString())
for i in 0 .. array1.Length - 1 do
printf "%s " (Array.get array1 i)
printfn " "
(* empty array *)
let array2 = Array.empty
printfn "Length of empty array: %d" array2.Length
let array3 = Array.create 10 7.0
printfn "Float Array: %A" array3
(* using the init and zeroCreate *)
let array4 = Array.init 10 (fun index -> index * index)
printfn "Array of squares: %A" array4
let array5 : float array = Array.zeroCreate 10
let (myZeroArray : float array) = Array.zeroCreate 10
printfn "Float Array: %A" array5
プログラムをコンパイルして実行すると、次の出力が得られます。
0 1 2 3 4 5 6 7 8 9
Length of empty array: 0
Float Array: [|7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0|]
Array of squares: [|0; 1; 4; 9; 16; 25; 36; 49; 64; 81|]
Float Array: [|0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0|]
例2
(* creating subarray from element 5 *)
(* containing 15 elements thereon *)
let array1 = [| 0 .. 50 |]
let array2 = Array.sub array1 5 15
printfn "Sub Array:"
printfn "%A" array2
(* appending two arrays *)
let array3 = [| 1; 2; 3; 4|]
let array4 = [| 5 .. 9 |]
printfn "Appended Array:"
let array5 = Array.append array3 array4
printfn "%A" array5
(* using the Choose function *)
let array6 = [| 1 .. 20 |]
let array7 = Array.choose (fun elem -> if elem % 3 = 0 then
Some(float (elem))
else
None) array6
printfn "Array with Chosen elements:"
printfn "%A" array7
(*using the Collect function *)
let array8 = [| 2 .. 5 |]
let array9 = Array.collect (fun elem -> [| 0 .. elem - 1 |]) array8
printfn "Array with collected elements:"
printfn "%A" array9
プログラムをコンパイルして実行すると、次の出力が得られます。
Sub Array:
[|5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19|]
Appended Array:
[|1; 2; 3; 4; 5; 6; 7; 8; 9|]
Array with Chosen elements:
[|3.0; 6.0; 9.0; 12.0; 15.0; 18.0|]
Array with collected elements:
[|0; 1; 0; 1; 2; 0; 1; 2; 3; 0; 1; 2; 3; 4|]
配列の検索
ザ・ Array.find functionはブール関数を取り、関数がtrueを返す最初の要素を返します。それ以外の場合はKeyNotFoundExceptionを発生させます。
ザ・ Array.findIndex 関数は、要素自体ではなく要素のインデックスを返すことを除いて、同様に機能します。
次の例はこれを示しています。
マイクロソフトは、この興味深いプログラムの例を提供しています。これは、完全な正方形と完全な立方体の両方である、指定された数の範囲内の最初の要素を見つけます。
let array1 = [| 2 .. 100 |]
let delta = 1.0e-10
let isPerfectSquare (x:int) =
let y = sqrt (float x)
abs(y - round y) < delta
let isPerfectCube (x:int) =
let y = System.Math.Pow(float x, 1.0/3.0)
abs(y - round y) < delta
let element = Array.find (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1
let index = Array.findIndex (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1
printfn "The first element that is both a square and a cube is %d and its index is %d." element index
プログラムをコンパイルして実行すると、次の出力が得られます。
The first element that is both a square and a cube is 64 and its index is 62.