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 값을 초기 값으로 사용해요. foldli와 foldl 함수는 f를 왼쪽에서 오른쪽으로(인덱스 증가 순서) 적용하고, foldri와 foldr은 오른쪽에서 왼쪽으로(인덱스 감소 순서) 작동해요. 더 일반적인 foldli와 foldri 함수는 f에 요소와 요소의 인덱스 모두를 제공해요. 인덱스 버전의 참조 구현은 MONO_ARRAY 매뉴얼 페이지를 참고하세요. 식 foldl f는 다음과 동등해요:
foldli (fn (_, a, x) => f(a, x))
foldr과 foldri 사이에도 비슷한 관계가 성립해요.
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)