Кортежи позволяют хранить несколько элементов разных типов как единое целое.
В некотором смысле кортежи похожи на списки, однако есть и фундаментальные отличия. Во-первых, кортежи гетерогенны, т. е. в одном кортеже можно хранить элементы нескольких различных типов. Во-вторых, кортежи имеют фиксированный размер: необходимо заранее знать, сколько именно элементов потребуется сохранить.
Кортежи обозначаются круглыми скобками, а их компоненты отделяются запятыми:
>ghci> (1, 3)
>(1,3)
>ghci> (3, 'a', "привет")
>(3,'a',"привет")
>ghci> (50, 50.4, "привет", 'b')
>(50,50.4,"привет",'b')
Подумайте о том, как бы мы представили двумерный вектор в языке Haskell. Один вариант – использовать список. Это могло бы сработать – ну а если нам нужно поместить несколько векторов в список для представления точек фигуры на двумерной плоскости?.. Мы могли бы, например, написать: >[[1,2],[8,11],[4,5]]
.
Проблема подобного подхода в том, что язык Haskell не запретит задать таким образом нечто вроде >[[1,2],[8,11,5],[4,5]]
– ведь это по-прежнему будет список списков с числами. Но по сути данная запись не имеет смысла. В то же время кортеж с двумя элементами (также называемый «парой») имеет свой собственный тип; это значит, что список не может содержать несколько пар, а потом «тройку» (кортеж размера 3). Давайте воспользуемся этим вариантом. Вместо того чтобы заключать векторы в квадратные скобки, применим круглые: >[(1,2),(8,11),(4,5)]
. А что произошло бы, если б мы попытались создать такую комбинацию: >[(1,2),(8,11,5),(4,5)]
? Получили бы ошибку:
>Couldn't match expected type `(t, t1)'
>against inferred type `(t2, t3, t4)'
>In the expression: (8, 11, 5)
>In the expression: [(1, 2), (8, 11, 5), (4, 5)]
>In the definition of `it': it = [(1, 2), (8, 11, 5), (4, 5)]
Мы попытались использовать пару и тройку в одном списке, и нас предупреждают: такого не должно быть. Нельзя создать и список вроде >[(1,2),("Один",2)]