Haskell Language
튜플 (쌍, 트리플 ...)
수색…
비고
Haskell은 기본적으로 하나의 컴포넌트를 가진 튜플을 지원하지 않는다.
단위 (written
()
)는 컴포넌트가없는 튜플로 이해할 수 있습니다.두 개 이상의 구성 요소가있는 튜플의 구성 요소를 추출하는 사전 정의 된 함수는 없습니다. 이러한 함수가 필요하다고 생각되면 튜플 유형 대신 레코드 레이블이있는 사용자 정의 데이터 유형을 사용하는 것이 좋습니다. 그런 다음 레코드 레이블을 함수로 사용하여 구성 요소를 추출 할 수 있습니다.
튜플 값을 만듭니다.
괄호와 쉼표를 사용하여 튜플을 만듭니다. 하나의 쉼표를 사용하여 쌍을 만듭니다.
(1, 2)
쉼표를 많이 사용하면 더 많은 구성 요소가있는 튜플을 만들 수 있습니다.
(1, 2, 3)
(1, 2, 3, 4)
unsugared 형식으로 튜플을 선언 할 수도 있습니다.
(,) 1 2 -- equivalent to (1,2)
(,,) 1 2 3 -- equivalent to (1,2,3)
튜플은 다른 유형의 값을 포함 할 수 있습니다.
("answer", 42, '?')
튜플은리스트 또는 더 많은 튜플과 같은 복잡한 값을 포함 할 수 있습니다.
([1, 2, 3], "hello", ('A', 65))
(1, (2, (3, 4), 5), 6)
튜플 유형 작성
튜플 유형을 작성하려면 괄호와 쉼표를 사용하십시오. 하나의 쉼표를 사용하여 쌍 유형을 작성하십시오.
(Int, Int)
쉼표를 많이 사용하면 더 많은 구성 요소로 튜플 유형을 작성할 수 있습니다.
(Int, Int, Int)
(Int, Int, Int, Int)
튜플은 다른 유형의 값을 포함 할 수 있습니다.
(String, Int, Char)
튜플은리스트 또는 더 많은 튜플과 같은 복잡한 값을 포함 할 수 있습니다.
([Int], String, (Char, Int))
(Int, (Int, (Int, Int), Int), Int)
튜플의 패턴 일치
튜플에서 패턴 매칭은 튜플 생성자를 사용합니다. 예를 들어 쌍을 일치 시키려면 (,)
생성자를 사용합니다.
myFunction1 (a, b) = ...
쉼표를 사용하여 튜플을 더 많은 구성 요소와 일치시킵니다.
myFunction2 (a, b, c) = ...
myFunction3 (a, b, c, d) = ...
튜플 패턴은 목록 패턴 또는 더 많은 튜플 패턴과 같은 복잡한 패턴을 포함 할 수 있습니다.
myFunction4 ([a, b, c], d, e) = ...
myFunction5 (a, (b, (c, d), e), f) = ...
튜플 컴포넌트 추출
Prelude
또는 Data.Tuple
의 fst
및 snd
함수를 사용하여 쌍의 첫 번째 및 두 번째 구성 요소를 추출합니다.
fst (1, 2) -- evaluates to 1
snd (1, 2) -- evaluates to 2
또는 패턴 일치를 사용하십시오.
case (1, 2) of (result, _) => result -- evaluates to 1
case (1, 2) of (_, result) => result -- evaluates to 2
두 개 이상의 구성 요소가있는 튜플의 경우에도 패턴 일치가 작동합니다.
case (1, 2, 3) of (result, _, _) => result -- evaluates to 1
case (1, 2, 3) of (_, result, _) => result -- evaluates to 2
case (1, 2, 3) of (_, _, result) => result -- evaluates to 3
Haskell은 두 개 이상의 컴포넌트를 가진 튜플에 대해 fst
나 snd
와 같은 표준 함수를 제공하지 않는다. Hackage의 tuple
라이브러리는 Data.Tuple.Select
모듈에서 이러한 함수를 제공합니다.
튜플에 바이너리 함수를 적용합니다 (uncurrying).
uncurry
함수 ( Prelude
또는 Data.Tuple
)를 사용하여 이진 함수를 튜플에있는 함수로 변환하십시오.
uncurry (+) (1, 2) -- computes 3
uncurry map (negate, [1, 2, 3]) -- computes [-1, -2, -3]
uncurry uncurry ((+), (1, 2)) -- computes 3
map (uncurry (+)) [(1, 2), (3, 4), (5, 6)] -- computes [3, 7, 11]
uncurry (curry f) -- computes the same as f
튜플 함수를 두 개의 인자에 적용 (currying)
튜플을 취하는 함수를 두 개의 인수를 취하는 함수로 변환하려면 Prelude
또는 Data.Tuple
의 curry
함수를 사용하십시오.
curry fst 1 2 -- computes 1
curry snd 1 2 -- computes 2
curry (uncurry f) -- computes the same as f
import Data.Tuple (swap)
curry swap 1 2 -- computes (2, 1)
스왑 쌍 구성 요소
한 쌍의 구성 요소를 교환하려면 swap
( Data.Tuple
)을 사용하십시오.
import Data.Tuple (swap)
swap (1, 2) -- evaluates to (2, 1)
또는 패턴 일치를 사용하십시오.
case (1, 2) of (x, y) => (y, x) -- evaluates to (2, 1)
튜플 매칭의 엄격 성
패턴 (p1, p2)
은 가장 바깥 쪽 튜플 생성자에서 엄격 하기 때문에 예기치 않은 엄격 성 동작이 발생할 수 있습니다. 예를 들어, 다음 표현식은 ( Data.Function.fix
사용하여) 발산합니다.
fix $ \(x, y) -> (1, 2)
튜플 생성자에서 (x, y)
의 일치가 엄격하기 때문입니다. 그러나 반박 할 수없는 패턴을 사용하는 다음 표현식은 예상대로 (1, 2)
로 평가됩니다.
fix $ \ ~(x, y) -> (1, 2)