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.unzip은 ListPair.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)
-