The ListPair 구조

The ListPair 구조

두 리스트를 페어링하는 함수예요.

출처: 문서

본문

시놉시스 (Synopsis)

signature LIST_PAIR
structure ListPair :> LIST_PAIR

인터페이스 (Interface)

exception UnequalLengths
val zip : 'a list * 'b list -> ('a * 'b) list
val zipEq : 'a list * 'b list -> ('a * 'b) list
val unzip : ('a * 'b) list -> 'a list * 'b list
val app : ('a * 'b -> unit) -> 'a list * 'b list -> unit
val appEq : ('a * 'b -> unit) -> 'a list * 'b list -> unit
val map : ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list
val mapEq : ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list
val foldl : ('a * 'b * 'c -> 'c)
-> 'c -> 'a list * 'b list -> 'c
val foldr : ('a * 'b * 'c -> 'c)
-> 'c -> 'a list * 'b list -> 'c
val foldlEq : ('a * 'b * 'c -> 'c)
-> 'c -> 'a list * 'b list -> 'c
val foldrEq : ('a * 'b * 'c -> 'c)
-> 'c -> 'a list * 'b list -> 'c
val all : ('a * 'b -> bool) -> 'a list * 'b list -> bool
val exists : ('a * 'b -> bool) -> 'a list * 'b list -> bool
val allEq : ('a * 'b -> bool) -> 'a list * 'b list -> bool

설명 (Description)

exception UnequalLengths

두 리스트에서 각각 하나씩 요소 쌍을 꺼내 함수를 적용하고, 상응하는 결과의 리스트를 돌려줘요. 두 리스트 중 짧은 쪽 길이만큼만 수행돼요.

zip (l1, l2)

두 리스트가 같은 길이이고, 각 위치의 요소가 대응하는 관계를 만족하면 true를 돌려줘요. 두 리스트가 다른 길이면 false를 돌려줘요.

zipEq (l1, l2)

두 리스트의 요소를 각각 쌍으로 묶은 리스트를 돌려줘요. 두 리스트 중 짧은 쪽 길이만큼만 결과가 생겨요. ListPair.zip (l1, l2)ListPair.unzip의 역이에요.

unzip l

쌍의 리스트를 두 리스트의 쌍으로 풀어요. ListPair.unzipListPair.zip의 역이에요.

app f (l1, l2)

appEq f (l1, l2)

이 함수들은 리스트 l1과 l2에서 왼쪽에서 오른쪽으로 생성된 요소 쌍의 리스트에 함수 f를 적용해요. 리스트 길이가 같지 않으면, 전자는 더 긴 리스트의 꼬리에서 초과 요소를 무시하고 후자는 UnequalLengths를 발생시켜요. 위 식들은 각각 다음과 동등해요 (함수 f의 가능한 부작용은 무시):

List.app f (zip (l1, l2))
List.app f (zipEq (l1, l2))

map f (l1, l2)

mapEq f (l1, l2)

이 함수들은 리스트 l1과 l2에서 왼쪽에서 오른쪽으로 생성된 요소 쌍의 리스트에 함수 f를 매핑해 결과 리스트를 돌려줘요. 리스트 길이가 같지 않으면, 전자는 더 긴 리스트의 꼬리에서 초과 요소를 무시하고 후자는 UnequalLengths를 발생시켜요. 위 식들은 각각 다음과 동등해요 (함수 f의 가능한 부작용은 무시):

List.map f (zip (l1, l2))
List.map f (zipEq (l1, l2))

foldl f init (l1, l2)

foldr f init (l1, l2)

foldlEq f init (l1, l2)

foldrEq f init (l1, l2)

이 함수들은 init 값을 시작 값으로 사용해 리스트 쌍 l1과 l2에 지정된 방향으로 함수 f를 접은 결과를 돌려줘요. 각각 다음과 동등해요 (f'는 fn ((a,b),c) => f(a,b,c)이고 함수 f의 가능한 부작용은 무시):

List.foldl f' init (zip (l1, l2))
List.foldr f' init (zip (l1, l2))
List.foldl f' init (zipEq (l1, l2))
List.foldr f' init (zipEq (l1, l2))

all f (l1, l2)

exists f (l1, l2)

이 함수들은 리스트 쌍에 대한 술어의 단락(short-circuit) 검사를 제공해요. 각각 다음과 동등해요:

List.all f (zip (l1, l2))
List.exists f (zip (l1, l2))

allEq f (l1, l2)

l1과 l2의 길이가 같고 모든 요소 쌍이 술어 f를 만족하면 true를 돌려줘요. 즉 식은 다음과 동등해요:

(List.length l1 = List.length l2) andalso
(List.all f (zip (l1, l2)))

이 함수는 다른 함수들과 좋은 대수 관계를 갖지 않는 것 같지만, 동등 타입에 대한 리스트 평등과 유사한 유용한 평등 개념을 제공하므로 포함돼요. 구현 참고: 구현은 간단해요:

fun allEq p ([], []) = true
| allEq p (x::xs, y::ys) = p(x,y) andalso allEq p (xs,ys)
| allEq _ _ = false
```## 더 알아보기 (Learn more)

-