The ARRAY_SLICE 시그니처

The ARRAY_SLICE 시그니처

ArraySlice 구조는 다형 배열을 위한 부분 배열(subarray) 추상화를 제공해요. 슬라이스 값은 삼중쌍 (a, i, n)으로 볼 수 있는데, a는 기본 배열, i는 시작 인덱스, n은 부분 배열의 길이이며 0 <= i <= i + n <= |a| 제약이 붙어요. 슬라이스는 배열에서 연속된 요소 부분집합을 지정하고 다루는 편리한 표기를 제공해요.

출처: 문서

본문

시놉시스 (Synopsis)

signature ARRAY_SLICE
structure ArraySlice :> ARRAY_SLICE

인터페이스 (Interface)

type 'a slice
val length : 'a slice -> int
val sub : 'a slice * int -> 'a
val update : 'a slice * int * 'a -> unit
val full : 'a Array.array -> 'a slice
val slice : 'a Array.array * int * int option -> 'a slice
val subslice : 'a slice * int * int option -> 'a slice
val base : 'a slice -> 'a Array.array * int * int
val vector : 'a slice -> 'a Vector.vector
val copy : {
src : 'a slice,
dst : 'a Array.array,
di : int
} -> unit
val copyVec : {
src : 'a VectorSlice.slice,
dst : 'a Array.array,
di : int
} -> unit
val isEmpty : 'a slice -> bool
val getItem : 'a slice -> ('a * 'a slice) option
val appi : (int * 'a -> unit) -> 'a slice -> unit
val app : ('a -> unit) -> 'a slice -> unit
val modifyi : (int * 'a -> 'a) -> 'a slice -> unit
val modify : ('a -> 'a) -> 'a slice -> unit
val foldli : (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b
val foldri : (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b
val foldl : ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b
val foldr : ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b
val findi : (int * 'a -> bool)
-> 'a slice -> (int * 'a) option
val find : ('a -> bool) -> 'a slice -> 'a option
val exists : ('a -> bool) -> 'a slice -> bool
val all : ('a -> bool) -> 'a slice -> bool
val collate : ('a * 'a -> order)
-> 'a slice * 'a slice -> order

설명 (Description)

length sl

|sl|, 즉 슬라이스의 길이(요소 수)를 돌려줘요. #3 (base sl)와 동등해요.

sub (sl, i)

슬라이스 sl의 i번째 요소를 돌려줘요. i < 0이거나 |sl| <= i이면 Subscript 예외가 발생해요.

update (sl, i, a)

슬라이스 sl의 i번째 요소를 a로 설정해요. i < 0이거나 |sl| <= i이면 Subscript 예외가 발생해요.

full arr

배열 arr 전체를 나타내는 슬라이스를 만들어요. 다음 식과 동등해요.

slice(arr, 0, NONE)

slice (arr, i, sz)

배열 arr의 인덱스 i에서 시작하는 슬라이스를 만들어요. sz가 NONE이면 슬라이스는 배열 끝까지의 모든 요소를 포함해요. 즉 arr[i..|arr|-1]이에요. i < 0이거나 |arr| < i이면 Subscript를 발생시켜요. szSOME(j)이면 슬라이스 길이는 j, 즉 arr[i..i+j-1]에 해당해요. i < 0, j < 0, |arr| < i + j 중 하나면 Subscript를 발생시켜요. 정의된 경우 i = |arr|일 때 slice는 빈 슬라이스를 돌려줘요.

subslice (sl, i, sz)

주어진 슬라이스 sl의 인덱스 i에서 시작하는 슬라이스를 만들어요. sz가 NONE이면 슬라이스는 끝까지의 모든 요소, 즉 sl[i..|sl|-1]을 포함해요. i < 0이거나 |sl| < i이면 Subscript를 발생시켜요. szSOME(j)이면 슬라이스 길이는 j, 즉 sl[i..i+j-1]이에요. i < 0, j < 0, |sl| < i + j 중 하나면 Subscript를 발생시켜요. 정의된 경우 i = |sl|일 때 subslice는 빈 슬라이스를 돌려줘요.

base sl

슬라이스의 구체적 표현인 삼중쌍 (arr, i, n)을 돌려줘요. arr는 기본 배열, i는 시작 인덱스, n은 슬라이스 길이예요.

vector sl

슬라이스 sl에서 벡터를 만들어요. 구체적으로 결과는 다음 식과 동등해요.

Vector.tabulate (length sl, fn i => sub (sl, i))

copy {src, dst, di}

이 함수들은 주어진 슬라이스를 배열 dst에 복사해요. src의 0 <= i < |src|인 i번째 요소를 목적지 배열의 di + i 위치로 복사해요. di < 0이거나 |dst| < di + |src|이면 Subscript 예외가 발생해요. 구현 참고: copydstsrc의 기본 배열이 같고 소스·목적지 슬라이스가 겹치는 경우를 올바르게 처리해야 해요.

copyVec {src, dst, di}

sl의 길이가 0이면 true를 돌려줘요.

isEmpty sl

sl의 첫 항목과 나머지 슬라이스, 또는 sl이 비어 있으면 NONE을 돌려줘요.

getItem sl

이 함수들은 증가하는 인덱스 순서로 슬라이스 요소에 함수 f를 적용해요. 더 일반적인 appi는 슬라이스에서 해당 요소의 인덱스를 f에 제공해요. 식 app f slappi (f o #2) sl과 동등해요.

appi f sl

이 함수들은 증가하는 인덱스 순서로 슬라이스 요소에 f를 적용하고 각 요소를 결과로 교체해요. 더 일반적인 modifyi는 슬라이스에서 해당 요소의 인덱스를 f에 제공해요. 식 modify f slmodifyi (f o #2) sl과 동등해요.

app f sl

이 함수들은 init을 초기 값으로 슬라이스 요소 위로 함수 f를 접어요. foldlifoldl은 왼쪽에서 오른쪽(인덱스 증가)으로, foldrifoldr은 오른쪽에서 왼쪽(인덱스 감소)으로 적용해요. 더 일반적인 foldlifoldri는 슬라이스에서 해당 요소의 인덱스를 f에 제공해요. 인덱스 버전의 참조 구현은 MONO_ARRAY 매뉴얼 페이지를 보세요. 식 foldl f init sl은 다음 식과 동등해요. foldrifoldr에도 유사한 동등 관계가 성립해요.

modifyi f sl

이 함수들은 슬라이스 sl의 각 요소에 증가하는 인덱스 순서로 f를 적용해서 참 값이 반환될 때까지 가요. 그렇게 되면 요소를 돌려주고, 아니면 NONE을 돌려줘요. 더 일반적인 버전인 findi는 슬라이스에서 요소의 인덱스도 f에 제공하고, 조건자를 만족하는 항목을 찾으면 그 인덱스와 요소를 함께 돌려줘요.

modify f sl

슬라이스 sl의 각 요소 x에 증가하는 인덱스 순서로 f를 적용해서 f x가 참이 될 때까지 가요. 그런 x가 있으면 true, 없으면 false를 돌려줘요.

foldli f init sl

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

foldri f init sl

주어진 순서 f로 두 슬라이스를 사전 비교해요.

foldl f init sl

foldr f init sl

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

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

findi f sl

find f sl

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

exists f sl

슬라이스 sl의 각 요소 x에 인덱스 증가 순서로 f x가 true가 될 때까지 f를 적용해요. 그런 x가 있으면 true, 없으면 false를 돌려줘요.

all f sl

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

collate f (sl, sl2)

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

  • [ Top | Parent | Contents | Index | Root ] Generated April 12
  • 2004 Last Modified June 20
  • 2000 Comments to John Reppy. This document may be distributed freely over the internet as long as the copyright notice and license terms below are prominently displayed within every machine-readable copy. Copyright © 2004 AT&T and Lucent Technologies. All rights reserved. Permission is granted for internet users to make one paper copy for their own personal use. Further hardcopy reproduction is strictly prohibited. Permission to distribute the HTML document electronically on any medium other than the internet must be requested from the copyright holders by contacting the editors. Printed versions of the SML Basis Manual are available from Cambridge University Press. To order
  • please visit www.cup.org (North America) or www.cup.cam.ac.uk (outside North America).