Почему это нельзя сделать проще?Или, может быть, есть какой-то простой способ?
Это может быть проще, если использовать последнюю альтернативу - пакет lens .Модуль Tuple имеет селекторы для до 9 элементов, и при необходимости можно определить больше.
> import Control.Lens
> data A = A deriving (Show)
> (1, '2', "3", A) ^. _1
1
> (1, '2', "3", A) ^. _2
'2'
> (1, '2', "3", A) ^. _3
"3"
> (1, '2', "3", A) ^. _4
A
Вы также можете использовать пакет lens чтобы обновить элементы полиморфно, измените тип при обновлении.
С и без инфиксных операторов:
> (1, '2', "3", A) & _1 .~ "wow"
("wow",'2',"3",A)
> set _1 "wow" (1, '2', "3", A)
("wow",'2',"3",A)
github readme - хорошее место, чтобы начать узнавать большео базовой теории, а также многочисленных примерах.
Не только кортежи
Подобный синтаксис работает для Traverables
и Foldables
, поэтому Trees, Maps, Векторы и т. Д. Например, если у меня есть список кортежей, я могу получить доступ к третьему элементу кортежа по индексу 1, составив element 1
для доступа к первому элементу индекса с помощью _3
для доступа к третьему элементу кортежа.
[(1,2,3),(4,5,6),(7,8,9)] ^? element 1 . _3
Just 6