Как изменить только один элемент кортежа, не переписывая его полностью? - PullRequest
2 голосов
/ 13 мая 2019

Как изменить только одно поле записи, не переписывая ее полностью?

Здесь я выучил полезный синтаксис Haskell для изменения элемента записи без его полной перезаписи:

oldrecord { somefield = newvalue }

Возможно ли нечто подобное с кортежами?

type ABigTuple = (Int, Int, Double, Int, String)

aBigTuple :: ABigTuple
aBigTuple = (5, 6, 3.2, 10, "asdf") 

anotherBigTuple = -- replace the 3rd elt of the prev tuple with 5.5 i/o 3.2

Возможно ли это аналогично записям или мне нужно переписать весь кортеж?

1 Ответ

11 голосов
/ 13 мая 2019

Я предполагаю, что под "переписыванием всего кортежа" вы подразумеваете что-то вроде

(\(a,b,_,d,e) -> (a,b,3.2,d,e))

Для кортежей есть линзы , ссылка имеет множество примеров.

_3 .~ (3.2 :: Double)
...