The MonoArray2 시그니처
The MonoArray2 시그니처
다형 배열 API를 1차원 배열에 특화해 단순화한 것으로, 요소가 참조형인 배열을 위한 추상화를 정의해요.
출처: 문서
본문
시놉시스 (Synopsis)
signature MONO_ARRAY2 (* OPTIONAL *)
structure Word8Array2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = Word8Vector.vector
where type elem = Word8.word
structure CharArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = CharVector.vector
where type elem = char
structure WideCharArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = WideCharVector.vector
where type elem = WideChar.char
structure BoolArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = BoolVector.vector
where type elem = bool
structure IntArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = IntVector.vector
where type elem = int
structure WordArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = WordVector.vector
where type elem = word
structure RealArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = RealVector.vector
where type elem = real
structure LargeIntArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = LargeIntVector.vector
where type elem = LargeInt.int
structure LargeWordArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = LargeWordVector.vector
where type elem = LargeWord.word
structure LargeRealArray2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = LargeRealVector.vector
where type elem = LargeReal.real
structure Int<N>Array2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = Int{N}Vector.vector
where type elem = Int{N}.int
structure Word<N>Array2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = Word{N}Vector.vector
where type elem = Word{N}.word
structure Real<N>Array2 :> MONO_ARRAY2 (* OPTIONAL *)
where type vector = Real{N}Vector.vector
where type elem = Real{N}.real
인터페이스 (Interface)
eqtype array
type elem
type vector
type region = {
base : array,
row : int,
col : int,
nrows : int option,
ncols : int option
}
datatype traversal = datatype Array2.traversal
val array : int * int * elem -> array
val fromList : elem list list -> array
val tabulate : traversal
-> int * int * (int * int -> elem)
-> array
val sub : array * int * int -> elem
val update : array * int * int * elem -> unit
val dimensions : array -> int * int
val nCols : array -> int
val nRows : array -> int
val row : array * int -> vector
val column : array * int -> vector
val copy : {
src : region,
dst : array,
dst_row : int,
dst_col : int
} -> unit
val appi : traversal
-> (int * int * elem -> unit)
-> region -> unit
val app : traversal -> (elem -> unit) -> array -> unit
val foldi : traversal
-> (int * int * elem * 'b -> 'b)
-> 'b -> region -> 'b
val fold : traversal
-> (elem * 'b -> 'b) -> 'b -> array -> 'b
val modifyi : traversal
-> (int * int * elem -> elem)
-> region -> unit
val modify : traversal -> (elem -> elem) -> array -> unit
설명 (Description)
type vector
array2 (m, n, x)는 차원 m x n의 2차원 배열을 만들어 각 요소를 x로 초기화해요. m 또는 n이 음수이거나 배열이 너무 크면 Size 예외를 발생시켜요. 2차원 배열 b에서 b의 인덱스는 행 i(0 기반)와 열 j(0 기반)의 쌍이에요. 인덱스가 범위를 벗어나면 Subscript 예외를 발생시켜요. 제약: 필수 시그니처 배열(요소 타입이 2차원)을 사용할 때 요소의 타입을 단일 x로 초기화해야 해요.
type region = {
base : array,
row : int,
col : int,
nrows : int option,
ncols : int option
}
배열의 행 수 m과 열 수 n을 각각 돌려줘요. b에서 nRows b는 행 수, nCols b는 열 수예요.
datatype traversal = datatype Array2.traversal
tabulate2 fi는 f(i,j)를 행 i, 열 j에 넣어 값으로 채운 2차원 배열을 돌려줘요. m 또는 n이 음수이거나 배열이 너무 크면 Size를 발생시켜요. f가 처리하는 인덱스 범위는 지정돼 있고, 행 i: 0부터 m-1, 열 j: 0부터 n-1이에요.
array (r, c, init)
fromList2 ll은 ListPair로 감싼 리스트 리스트 ll을 2차원 배열로 변환해요. 각 행 리스트의 길이가 같아야 하고, 그렇지 않으면 Size를 발생시켜요. toList2 a2는 a2의 행을 리스트 리스트로 담아 돌려줘요.
fromList l
이 함수들은 배열의 벡터 변환을 제공해요. toVector2 a2는 a2의 요소를 행 우선 순서로 담은 1차원 벡터를 돌려줘요. fromVector2 (m, n, v)는 v의 요소를 m x n 크기의 2차원 배열로 돌려줘요. m과 n의 곱이 v의 길이와 다르거나, m 또는 n이 음수이면 Size를 발생시켜요.
tabulate tr (r, c, f)
map2 f a2는 a2의 각 요소에 f를 적용한 결과로 같은 크기의 새 배열을 돌려줘요. map2i f a2는 f에 인덱스 (i,j)를 전달해 같은 크기의 새 배열을 돌려줘요. copy2 a2는 a2를 얕은 복사한 새 배열을 돌려줘요. app2 f a2는 a2의 각 요소에 f를 적용해 부수 효과를 일으켜요.
sub (arr, i, j)
modify2i f a2는 a2의 각 요소에 f(i,j)를 적용해 부수 효과를 일으키고, modify2 f a2는 정수 인덱스 없이 요소에 f를 적용해요.
update (arr, i, j, a)
배열 arr의 (i,j)번째 요소를 a로 설정해요. i < 0, j < 0, nRows arr <= i, nCols arr <= j 중 하나면 Subscript 예외가 발생해요.
dimensions arr
nCols arr
nRows arr
이 함수들은 배열 arr에 관한 크기 정보를 돌려줘요. nCols는 열 개수, nRows는 행 개수를 돌려주고 dimension은 배열의 행·열 개수를 담은 쌍을 돌려줘요. nRows와 nCols는 각각 #1 o dimensions과 #2 o dimensions와 동등해요.
row (arr, i)
arr의 i번째 행을 돌려줘요. i < 0이거나 nRows arr <= i이면 Subscript를 발생시켜요.
column (arr, j)
arr의 j번째 열을 돌려줘요. j < 0이거나 nCols arr <= j이면 Subscript를 발생시켜요.
copy {src, dst, dst_row, dst_col}
영역 src를 배열 dst로 복사해요. (#row src,#col src)번째 요소가 목적지 배열의 (dst_row,dst_col) 위치에 복사돼요. 소스 영역이 유효하지 않으면 Subscript 예외가 발생해요. 마찬가지로 파생된 목적지 영역(소스 영역 src를 (dst_row,dst_col)로 이동한 것)이 dst에서 유효하지 않아도 Subscript 예외가 발생해요. 구현 참고: copy 함수는 src와 dst가 같고 소스·목적지 영역이 겹치는 경우를 올바르게 처리해야 해요.
appi tr f reg
app tr f arr
이 함수들은 tr이 지정한 순서로 배열의 요소에 함수 f를 적용해요. 더 일반적인 appi 함수는 영역 reg의 요소에 f를 적용하며 요소와 그 기본 배열에서의 좌표를 모두 f에 제공해요. reg가 유효하지 않으면 Subscript 예외가 발생해요. app 함수는 전체 배열에 f를 적용하고 요소의 좌표는 f에 제공하지 않아요. 따라서 식 app tr f arr는 다음과 동등해요:
appi tr (f o #3) (arr, {row=0,col=0,nrows=NONE,ncols=NONE})
foldi tr f init reg
fold tr f init arr
이 함수들은 배열 arr의 요소 위로 함수 f를 접으면서 tr 순서로 요소를 순회하고 init 값을 초기 값으로 사용해요. 더 일반적인 foldi 함수는 영역 reg의 요소에 f를 적용하며 요소와 그 기본 배열에서의 좌표를 모두 f에 제공해요. reg가 유효하지 않으면 Subscript 예외가 발생해요. fold 함수는 전체 배열에 f를 적용하고 요소의 좌표는 f에 제공하지 않아요. 따라서 식 fold tr f init arr는 다음과 동등해요:
foldi tr (fn (_,_,a,b) => f (a,b)) init
(arr, {row=0, col=0, nrows=NONE, ncols=NONE})
modifyi tr f reg
modify tr f arr
이 함수들은 tr이 지정한 순서로 배열의 요소에 함수 f를 적용하고 각 요소를 f의 결과로 교체해요. 더 일반적인 modifyi 함수는 영역 reg의 요소에 f를 적용하며 요소와 그 기본 배열에서의 좌표를 모두 f에 제공해요. reg가 유효하지 않으면 Subscript 예외가 발생해요. modify 함수는 전체 배열에 f를 적용하고 요소의 좌표는 f에 제공하지 않아요. 따라서 식 modify f arr는 다음과 동등해요:
modifyi (f o #3) (arr, {row=0,col=0,nrows=NONE,ncols=NONE})
```## 더 알아보기 (Learn more)
-