F #-배열
배열은 모두 동일한 유형 인 연속 데이터 요소의 고정 크기, 0 기반, 변경 가능한 컬렉션입니다.
배열 생성
다양한 구문과 방법을 사용하거나 Array 모듈의 함수를 사용하여 배열을 만들 수 있습니다. 이 섹션에서는 모듈 함수를 사용하지 않고 배열을 만드는 방법에 대해 설명합니다.
함수없이 배열을 생성하는 세 가지 구문 적 방법이 있습니다.
- [| 및 |] 및 세미콜론으로 구분됩니다.
- 각 요소를 별도의 줄에 배치합니다.이 경우 세미콜론 구분 기호는 선택 사항입니다.
- 시퀀스 표현식을 사용합니다.
점 연산자 (.)와 대괄호 ([및])를 사용하여 배열 요소에 액세스 할 수 있습니다.
다음 예제는 배열 생성을 보여줍니다-
//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 → 단위 | 한 배열에서 요소 범위를 읽고 다른 배열에 씁니다. |
선택 : ( 'T → U 옵션) →'T [] → 'U [] | 제공된 함수를 배열의 각 요소에 적용합니다. 함수가 Some (x)를 반환하는 각 요소에 대한 결과 x를 포함하는 배열을 반환합니다. |
수집 : ( 'T →'U []) → T [] → 'U [] | 제공된 함수를 배열의 각 요소에 적용하고 결과를 연결하고 결합 된 배열을 반환합니다. |
연결 : seq < 'T []> →'T [] | 제공된 각 배열 시퀀스의 요소를 포함하는 배열을 만듭니다. |
복사 : 'T →'T [] | 제공된 배열의 요소를 포함하는 배열을 만듭니다. |
생성 : int → 'T →'T [] | 요소가 모두 초기에 제공된 값인 배열을 만듭니다. |
비어 있음 : 'T [] | 주어진 유형의 빈 배열을 반환합니다. |
존재 : ( 'T → bool) →'T [] → bool | 배열의 요소가 제공된 조건자를 충족하는지 여부를 테스트합니다. |
exist2 : ( 'T1 →'T2 → bool) → 'T1 [] →'T2 [] → bool | 두 배열의 해당 요소 쌍이 제공된 조건을 충족하는지 여부를 테스트합니다. |
채우기 : 'T [] → int → int →'T → 단위 | 배열의 요소 범위를 제공된 값으로 채 웁니다. |
필터 : ( 'T → bool) →'T [] → 'T [] | 제공된 조건이 반환하는 제공된 배열의 요소 만 포함하는 컬렉션을 반환합니다. true. |
찾기 : ( 'T → bool) →'T [] → 'T | 제공된 함수가 반환하는 첫 번째 요소를 반환합니다. true. 그러한 요소가없는 경우 KeyNotFoundException을 발생시킵니다. |
findIndex : ( 'T → bool) →'T [] → int | 제공된 조건을 충족하는 배열에서 첫 번째 요소의 인덱스를 반환합니다. 조건을 만족하는 요소가 없으면 KeyNotFoundException을 발생시킵니다. |
fold : ( 'State →'T → 'State) →'State → 'T [] →'State | 계산을 통해 누산기 인수를 스레딩하여 배열의 각 요소에 함수를 적용합니다. 입력 함수가 f이고 배열 요소가 i0 ... iN이면이 함수는 f (... (fs i0) ...) iN을 계산합니다. |
fold2 : ( '상태 →'T1 → 'T2 →'상태) → '상태 →'T1 [] → 'T2 [] →'상태 | 계산을 통해 누산기 인수를 스레딩하는 왼쪽에서 오른쪽으로 제공된 두 배열의 요소 쌍에 함수를 적용합니다. 두 입력 배열의 길이는 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
foldBack : ( 'T →'상태 → '상태) →'T [] → '상태 →'상태 | 계산을 통해 누산기 인수를 스레딩하여 배열의 각 요소에 함수를 적용합니다. 입력 함수가 f이고 배열 요소가 i0 ... iN이면이 함수는 f i0 (... (f iN s))를 계산합니다. |
foldBack2 : ( 'T1 →'T2 → '상태 →'상태) → 'T1 [] →'T2 [] → '상태 →'상태 | 계산을 통해 누산기 인수를 스레딩하는 오른쪽에서 왼쪽으로 제공된 두 배열의 요소 쌍에 함수를 적용합니다. 두 입력 배열의 길이는 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
forall : ( 'T → bool) →'T [] → bool | 배열의 모든 요소가 제공된 조건을 충족하는지 테스트합니다. |
forall2 : ( 'T1 →'T2 → bool) → 'T1 [] →'T2 [] → bool | 제공된 두 배열의 모든 해당 요소가 제공된 조건을 충족하는지 테스트합니다. |
get : 'T [] → int →'T | 배열에서 요소를 가져옵니다. |
init : int → (int → 'T) →'T [] | 제공된 함수를 사용하여 제공된 차원의 배열을 만듭니다. |
isEmpty : 'T [] → bool | 배열에 요소가 있는지 여부를 테스트합니다. |
iter : ( 'T → 단위) →'T [] → 단위 | 제공된 함수를 배열의 각 요소에 적용합니다. |
iter2 : ( 'T1 →'T2 → 단위) → 'T1 [] →'T2 [] → 단위) | 제공된 함수를 두 배열의 일치하는 인덱스에서 요소 쌍에 적용합니다. 두 배열은 길이가 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
iteri : (int → 'T → unit) →'T [] → unit | 제공된 함수를 배열의 각 요소에 적용합니다. 함수에 전달 된 정수는 요소의 인덱스를 나타냅니다. |
iteri2 : (int → 'T1 →'T2 → 단위) → 'T1 [] →'T2 [] → 단위 | 제공된 함수를 두 배열의 일치하는 인덱스에서 요소 쌍에 적용하고 요소의 인덱스도 전달합니다. 두 배열은 길이가 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
길이 : 'T [] → int | 배열의 길이를 반환합니다. Length 속성은 동일한 작업을 수행합니다. |
지도 : ( 'T →'U) → 'T [] →'U [] | 제공된 함수를 제공된 배열의 각 요소에 적용한 결과 인 요소가있는 배열을 만듭니다. |
map2 : ( 'T1 →'T2 → 'U) →'T1 [] → 'T2 [] →'U [] | 제공된 함수를 제공된 두 배열의 해당 요소에 적용한 결과 인 요소가있는 배열을 만듭니다. 두 입력 배열의 길이는 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
mapi : (int → 'T →'U) → 'T [] →'U [] | 제공된 함수를 제공된 배열의 각 요소에 적용한 결과 인 요소가있는 배열을 만듭니다. 함수에 전달 된 정수 인덱스는 변환되는 요소의 인덱스를 나타냅니다. |
mapi2 : (int → 'T1 →'T2 → 'U) →'T1 [] → 'T2 [] →'U [] | 제공된 함수를 쌍으로 두 컬렉션의 해당 요소에 적용한 결과 인 요소가 요소의 인덱스도 전달하는 배열을 만듭니다. 두 입력 배열의 길이는 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
최대 : 'T [] →'T | 배열의 모든 요소 중 가장 큰 요소를 반환합니다. Operators.max는 요소를 비교하는 데 사용됩니다. |
maxBy : ( 'T →'U) → 'T [] →'T | 함수 결과에서 Operators.max를 통해 비교 한 배열의 모든 요소 중 가장 큰 요소를 반환합니다. |
min : ( 'T [] →'T | 배열의 모든 요소 중 가장 작은 요소를 반환합니다. Operators.min은 요소를 비교하는 데 사용됩니다. |
minBy : ( 'T →'U) → 'T [] →'T | 배열의 모든 요소 중 가장 작은 요소를 반환합니다. Operators.min은 요소를 비교하는 데 사용됩니다. |
ofList : 'T리스트 →'T [] | 제공된 목록에서 배열을 만듭니다. |
ofSeq : seq < 'T> →'T [] | 제공된 열거 가능한 개체에서 배열을 만듭니다. |
파티션 : ( 'T → bool) →'T [] → 'T [] *'T [] | 배열을 두 개의 배열로 분할합니다. 하나는 제공된 조건이 반환하는 요소를 포함합니다. true, 그리고 그것이 반환하는 것을 포함하는 다른 false. |
permute : (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을 계산합니다. 배열의 크기가 0이면 ArgumentException이 발생합니다. |
reduceBack : ( 'T →'T → 'T) →'T [] → 'T | 계산을 통해 누산기 인수를 스레딩하여 배열의 각 요소에 함수를 적용합니다. 입력 함수가 f이고 요소가 i0 ... iN이면이 함수는 f i0 (... (f iN-1 iN))을 계산합니다. 배열의 크기가 0이면 ArgumentException이 발생합니다. |
rev : 'T [] →'T [] | 제공된 배열에서 요소의 순서를 반대로합니다. |
스캔 : ( '상태 →'T → '상태) →'상태 → 'T [] →'상태 []) | 접기처럼 동작하지만 최종 결과와 함께 중간 결과를 반환합니다. |
scanBack : ( 'T →'상태 → '상태) →'T [] → '상태 →'상태 [] | foldBack처럼 동작하지만 최종 결과와 함께 중간 결과를 반환합니다. |
설정 : 'T [] → int →'T → 단위 | 배열의 요소를 설정합니다. |
정렬 : 'T [] →'T [] | 배열의 요소를 정렬하고 새 배열을 반환합니다. Operators.compare는 요소를 비교하는 데 사용됩니다. |
sortBy : ( 'T →'키) → 'T [] →'T [] | 제공된 함수를 사용하여 요소를 정렬 작업의 기반이되는 형식으로 변환하여 배열의 요소를 정렬하고 새 배열을 반환합니다. Operators.compare는 요소를 비교하는 데 사용됩니다. |
sortInPlace : 'T [] → 단위 | 제공된 비교 함수를 사용하여 제자리에서 배열을 변경하여 배열 요소를 정렬합니다. Operators.compare는 요소를 비교하는 데 사용됩니다. |
sortInPlaceBy : ( 'T →'키) → 'T [] → 단위 | 키에 제공된 프로젝션을 사용하여 제자리에서 배열을 변경하여 배열 요소를 정렬합니다. Operators.compare는 요소를 비교하는 데 사용됩니다. |
sortInPlaceWith : ( 'T →'T → int) → 'T [] → 단위 | 제공된 비교 함수를 사용하여 배열을 변경하여 배열의 요소를 정렬합니다. |
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 [] | 튜플 쌍의 배열을 두 배열의 튜플로 분할합니다. |
unzip3 : ( 'T1 *'T2 * 'T3) [] →'T1 [] * 'T2 [] *'T3 [] | 세 요소의 튜플 배열을 세 배열의 튜플로 분할합니다. |
zeroCreate : int → 'T [] | 요소가 초기에 기본값 Unchecked.defaultof < 'T>로 설정된 배열을 만듭니다. |
zip : 'T1 [] →'T2 [] → ( 'T1 *'T2) [] | 두 배열을 요소가 두 개인 튜플 배열로 결합합니다. 두 배열의 길이는 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
zip3 : 'T1 [] →'T2 [] → 'T3 [] → ('T1 * 'T2 * 113'T3) [] | 세 개의 배열을 세 개의 요소가있는 튜플의 배열로 결합합니다. 세 배열의 길이는 같아야합니다. 그렇지 않으면 ArgumentException이 발생합니다. |
다음 섹션에서는 이러한 기능 중 일부를 사용하는 방법을 살펴 봅니다.
함수를 사용하여 배열 만들기
어레이 모듈은 처음부터 어레이를 생성하는 여러 기능을 제공합니다.
그만큼 Array.empty 함수는 새로운 빈 배열을 만듭니다.
그만큼 Array.create 함수는 지정된 크기의 배열을 만들고 모든 요소를 주어진 값으로 설정합니다.
그만큼 Array.init 함수는 요소를 생성하는 차원과 함수가 주어지면 배열을 만듭니다.
그만큼 Array.zeroCreate 함수는 모든 요소가 0 값으로 초기화되는 배열을 만듭니다.
그만큼 Array.copy 함수는 기존 배열에서 복사 된 요소를 포함하는 새 배열을 만듭니다.
그만큼 Array.sub 함수는 배열의 하위 범위에서 새 배열을 생성합니다.
그만큼 Array.append 함수는 두 개의 기존 배열을 결합하여 새 배열을 만듭니다.
그만큼 Array.choose 함수는 새 배열에 포함 할 배열 요소를 선택합니다.
그만큼 Array.collect 함수는 기존 배열의 각 배열 요소에서 지정된 함수를 실행 한 다음 함수에서 생성 된 요소를 수집하여 새 배열로 결합합니다.
그만큼 Array.concat 함수는 배열의 시퀀스를 가져 와서 단일 배열로 결합합니다.
그만큼 Array.filter 함수는 부울 조건 함수를 취하고 조건이 참인 입력 배열의 요소 만 포함하는 새 배열을 생성합니다.
그만큼 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 함수는 부울 함수를 취하고 함수가 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.