The MonomorphicVector 시그니처

The MonomorphicVector 시그니처

MonomorphicVector 시그니처는 요소가 단일(비다형) 타입인 벡터를 위한 추상화를 정의해요. 요소가 추상 타입 단위로 복사될 수 없기 때문에, 다형 벡터 구현처럼 밀집된(inline) 벡터 레이아웃을 제공하기 위해 성능상 구분해요.

출처: 문서

본문

시놉시스 (Synopsis)

signature MONO_VECTOR
structure Word8Vector :> MONO_VECTOR
where type elem = Word8.word
structure CharVector :> MONO_VECTOR
where type vector = String.string
where type elem = char
structure WideCharVector :> MONO_VECTOR (* OPTIONAL *)
where type vector = WideString.string
where type elem = WideChar.char
structure BoolVector :> MONO_VECTOR (* OPTIONAL *)
where type elem = bool
structure IntVector :> MONO_VECTOR (* OPTIONAL *)
where type elem = int
structure WordVector :> MONO_VECTOR (* OPTIONAL *)
where type elem = word
structure RealVector :> MONO_VECTOR (* OPTIONAL *)
where type elem = real
structure LargeIntVector :> MONO_VECTOR (* OPTIONAL *)
where type elem = LargeInt.int
structure LargeWordVector :> MONO_VECTOR (* OPTIONAL *)
where type elem = LargeWord.word
structure LargeRealVector :> MONO_VECTOR (* OPTIONAL *)
where type elem = LargeReal.real
structure Int<N>Vector :> MONO_VECTOR (* OPTIONAL *)
where type elem = Int{N}.int
structure Word<N>Vector :> MONO_VECTOR (* OPTIONAL *)
where type elem = Word{N}.word
structure Real<N>Vector :> MONO_VECTOR (* OPTIONAL *)
where type elem = Real{N}.real

인터페이스 (Interface)

type vector
type elem
val maxLen : int
val fromList : elem list -> vector
val tabulate : int * (int -> elem) -> vector
val length : vector -> int
val sub : vector * int -> elem
val update : vector * int * elem -> vector
val concat : vector list -> vector
val appi : (int * elem -> unit) -> vector -> unit
val app : (elem -> unit) -> vector -> unit
val mapi : (int * elem -> elem) -> vector -> vector
val map : (elem -> elem) -> vector -> vector
val foldli : (int * elem * 'a -> 'a) -> 'a -> vector -> 'a
val foldri : (int * elem * 'a -> 'a) -> 'a -> vector -> 'a
val foldl : (elem * 'a -> 'a) -> 'a -> vector -> 'a
val foldr : (elem * 'a -> 'a) -> 'a -> vector -> 'a
val findi : (int * elem -> bool)
-> vector -> (int * elem) option
val find : (elem -> bool) -> vector -> elem option
val exists : (elem -> bool) -> vector -> bool
val all : (elem -> bool) -> vector -> bool
val collate : (elem * elem -> order)
-> vector * vector -> order

설명 (Description)

val maxLen : int

vector (init, len)은 각 요소가 init으로 초기화된 길이 len의 벡터를 돌려줘요. len < 0이거나 벡터 생성에 실패하면 Size 예외를 발생시켜요.

fromList l

length v는 벡터 v의 길이를 돌려줘요. nth (v, i)는 v의 i번째 요소를 돌려줘요. 범위 밖 인덱스는 Subscript를 발생시켜요.

tabulate (n, f)

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

fromList (List.tabulate (n, f))

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

length vec

|vec|, 즉 벡터 vec의 길이(요소 수)를 돌려줘요.

sub (vec, i)

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

update (vec, i, x)

vec와 같되 vec의 i번째 요소가 x로 설정된 새 벡터를 돌려줘요. i < 0이거나 |vec| <= i이면 Subscript 예외가 발생해요.

concat l

리스트 l에 있는 벡터들을 이어 붙인 벡터를 돌려줘요. 이 벡터들의 전체 길이가 maxLen을 초과하면 Size 예외가 발생해요.

appi f vec

app f vec

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

appi (f o #2) vec

mapi f vec

map f vec

이 함수들은 인자 벡터 위로 함수 f를 왼쪽에서 오른쪽으로 매핑해 새 벡터를 만들어요. 더 일반적인 mapi 함수는 f에 요소와 요소의 인덱스 모두를 제공해요. 식 mapi f vec는 다음과 동등해요: 식 map f vec는 다음과 동등해요:

fromList (List.map f (foldri (fn (i,a,l) => (i,a)::l) [] vec))
mapi (f o #2) vec

foldli f init vec

foldri f init vec

foldl f init vec

foldr f init vec

이 함수들은 벡터의 모든 요소 위로 함수 f를 접으면서 init 값을 초기 값으로 사용해요. foldlifoldl 함수는 f를 왼쪽에서 오른쪽으로(인덱스 증가 순서) 적용하고, foldrifoldr은 오른쪽에서 왼쪽으로(인덱스 감소 순서) 작동해요. 더 일반적인 foldlifoldri 함수는 f에 요소와 요소의 인덱스 모두를 제공해요. 인덱스 버전의 참조 구현은 MONO_ARRAY 매뉴얼 페이지를 참고하세요. 식 foldl f는 다음과 동등해요:

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

foldrfoldri 사이에도 비슷한 관계가 성립해요.

findi f vec

find f vec

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

exists f vec

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

all f vec

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

collate f (v1, v2)

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