The MonomorphicArray 시그니처

The MonomorphicArray 시그니처

MonomorphicArray 시그니처는 요소가 단일(비다형) 타입인 배열을 위한 추상화를 정의해요. 단일 요소가 있는 배열이라 배치 레이아웃이 밀집해 더 효율적인 구현이 가능해요.

출처: 문서

본문

시놉시스 (Synopsis)

signature MONO_ARRAY
structure Word8Array :> MONO_ARRAY
where type vector = Word8Vector.vector
where type elem = Word8.word
structure CharArray :> MONO_ARRAY
where type vector = CharVector.vector
where type elem = char
structure WideCharArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = WideCharVector.vector
where type elem = WideChar.char
structure BoolArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = BoolVector.vector
where type elem = bool
structure IntArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = IntVector.vector
where type elem = int
structure WordArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = WordVector.vector
where type elem = word
structure RealArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = RealVector.vector
where type elem = real
structure LargeIntArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = LargeIntVector.vector
where type elem = LargeInt.int
structure LargeWordArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = LargeWordVector.vector
where type elem = LargeWord.word
structure LargeRealArray :> MONO_ARRAY (* OPTIONAL *)
where type vector = LargeRealVector.vector
where type elem = LargeReal.real
structure Int<N>Array :> MONO_ARRAY (* OPTIONAL *)
where type vector = Int{N}Vector.vector
where type elem = Int{N}.int
structure Word<N>Array :> MONO_ARRAY (* OPTIONAL *)
where type vector = Word{N}Vector.vector
where type elem = Word{N}.word
structure Real<N>Array :> MONO_ARRAY (* OPTIONAL *)
where type vector = Real{N}Vector.vector
where type elem = Real{N}.real

인터페이스 (Interface)

eqtype array
type elem
type vector
val maxLen : int
val array : int * elem -> array
val fromList : elem list -> array
val tabulate : int * (int -> elem) -> array
val length : array -> int
val sub : array * int -> elem
val update : array * int * elem -> unit
val vector : array -> vector
val copy : {src : array, dst : array, di : int} -> unit
val copyVec : {src : vector, dst : array, di : int} -> unit
val appi : (int * elem -> unit) -> array -> unit
val app : (elem -> unit) -> array -> unit
val modifyi : (int * elem -> elem) -> array -> unit
val modify : (elem -> elem) -> array -> unit
val foldli : (int * elem * 'b -> 'b) -> 'b -> array -> 'b
val foldri : (int * elem * 'b -> 'b) -> 'b -> array -> 'b
val foldl : (elem * 'b -> 'b) -> 'b -> array -> 'b
val foldr : (elem * 'b -> 'b) -> 'b -> array -> 'b
val findi : (int * elem -> bool)
-> array -> (int * elem) option
val find : (elem -> bool) -> array -> elem option
val exists : (elem -> bool) -> array -> bool
val all : (elem -> bool) -> array -> bool
val collate : (elem * elem -> order)
-> array * array -> order

설명 (Description)

type vector

인덱스의 범위를 나타내는 함수예요. 요소 타입이 isSMLSharp라 불리는 특수 메타함수에 유효해요. (이 점은 유일하게 이 시그니처가 필요한 요소이기도 해요.)

val maxLen : int

이 구현이 지원하는 배열의 최대 길이예요. 더 큰 배열을 만들려 하면 Size 예외가 발생해요.

array (n, init)

길이 n의 새 배열을 만들고 각 요소를 init 값으로 초기화해요. n < 0이거나 maxLen < n이면 Size 예외가 발생해요.

fromList l

l에서 새 배열을 만들어요. 배열의 길이는 length l이고, l의 i번째 요소가 배열의 i번째 요소로 사용돼요. 리스트의 길이가 maxLen보다 크면 Size 예외가 발생해요.

tabulate (n, f)

n개 요소의 배열을 만들어요. 요소들은 인덱스 증가 순서로, 요소의 인덱스에 f를 적용해 정의돼요. 이는 다음 식과 동등해요:

fromList (List.tabulate (n, f))

n < 0이거나 maxLen < n이면 Size 예외가 발생해요.

length arr

|arr|, 즉 배열 arr의 요소 수를 돌려줘요.

sub (arr, i)

배열 arr의 i번째 요소를 돌려줘요. i < 0이거나 |arr| <= i이면 Subscript 예외가 발생해요.

update (arr, i, x)

배열 arr의 i번째 요소를 x로 설정해요. i < 0이거나 |arr| <= i이면 Subscript 예외가 발생해요.

vector arr

arr에서 벡터를 생성해요. 구체적으로 결과 벡터가 vec라면 |vec| = |arr|이고, 0 <= i < |arr|인 각 i에 대해 vec의 i번째 요소는 sub (arr, i)예요.

copy {src, dst, di}

copyVec {src, dst, di}

이 함수들은 배열 또는 벡터 src 전체를 배열 dst로 복사해요. src에서 0 <= i < |src|인 i번째 요소가 목적지 배열의 di + i 위치에 복사돼요. di < 0이거나 |dst| < di+|src|이면 Subscript 예외가 발생해요. 구현 참고: copy에서 dst와 src가 같으면 예외를 피하려면 di = 0이어야 하고, 그러면 copy는 항등이 돼요.

appi f arr

app f arr

이 함수들은 배열의 요소에 왼쪽에서 오른쪽 순서로(즉 인덱스 증가 순서) 함수 f를 적용해요. 더 일반적인 appi 함수는 f에 요소와 요소의 인덱스 모두를 제공해요. 식 app f arr는 다음과 동등해요:

appi (f o #2) arr

modifyi f arr

modify f arr

이 함수들은 배열의 요소에 왼쪽에서 오른쪽 순서로(즉 인덱스 증가 순서) 함수 f를 적용하고 각 요소를 f를 적용한 결과로 교체해요. 더 일반적인 modifyi 함수는 f에 요소와 요소의 인덱스 모두를 제공해요. 식 modify f arr는 다음과 동등해요:

modifyi (f o #2) arr

foldli f init arr

foldri f init arr

foldl f init arr

foldr f init arr

이 함수들은 배열의 모든 요소 위로 함수 f를 접으면서 init 값을 초기 값으로 사용해요. foldlifoldl 함수는 f를 왼쪽에서 오른쪽으로(인덱스 증가 순서) 적용하고, foldrifoldr은 오른쪽에서 왼쪽으로(인덱스 감소 순서) 작동해요. 더 일반적인 foldlifoldri 함수는 f에 해당 요소의 배열 인덱스를 함께 제공해요. 인덱스 버전은 다음과 같이 구현할 수 있어요:

fun foldli f init seq = let
val len = length seq
fun loop (i, b) =
if i = len then b
else loop(i+1,f(i,sub(seq,i),b))
in
loop(0,init)
end
fun foldri f init seq = let
val len = length seq
fun loop (i, b) =
if i = ~1 then b
else loop(i-1,f(i,sub(seq,i),b))
in
loop(len-1,init)
end

foldl f init arr는 다음과 동등해요:

foldli (fn (_, a, x) => f(a, x)) init arr

foldrifoldr에도 유사한 동등 관계가 성립해요.

findi f arr

find f arr

이 함수들은 배열 arr의 각 요소에 왼쪽에서 오른쪽으로(즉 인덱스 증가 순서) f를 적용해 true 값이 반환될 때까지 진행해요. 그렇게 되면 요소를 돌려주고, 그렇지 않으면 NONE을 돌려줘요. 더 일반적인 findi 버전은 f에 요소의 배열 인덱스도 함께 제공하고, 술어를 만족하는 항목을 찾으면 그 인덱스를 요소와 함께 돌려줘요.

exists f arr

배열 arr의 각 요소 x에 왼쪽에서 오른쪽으로(즉 인덱스 증가 순서) f x가 true가 될 때까지 f를 적용해요. 그런 x가 있으면 true, 없으면 false를 돌려줘요.

all f arr

배열 arr의 각 요소 x에 왼쪽에서 오른쪽으로(즉 인덱스 증가 순서) f x가 false가 될 때까지 f를 적용해요. 그런 x가 있으면 false, 없으면 true를 돌려줘요. not(exists (not o f) arr))와 동등해요.

collate f (a1, a2)

요소에 대한 주어진 순서 f를 사용해 두 배열을 사전식으로 비교해요.## 더 알아보기 (Learn more)