Powiedzmy mam następujący zapis ADT:Skrócony sposób na przypisanie pojedynczego pola do rekordu, podczas kopiowania pozostałych pól?
data Foo = Bar { a :: Integer, b :: String, c :: String }
chcę funkcję, która pobiera rekord i zwraca rekord (tego samego typu), gdzie wszystko ale jedno z pól mają identyczne wartości do jednego przeszedł jako argument, tak jak poniżej:
walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }
powyższe działa, ale do rekordu z kilku dziedzin (słownie 10
), tworząc taką funkcję wiązałoby dużo pisania, że czuję się zupełnie niepotrzebne.
Czy istnieją mniej żmudne sposoby robienia tego samego?
Składnia rekordów do aktualizacji istnieje, ale szybko staje się kłopotliwa. Zobacz zamiast tego [soczewki] (http://stackoverflow.com/questions/5767129/lenses-fclabels-data-accessor-which-library-for-structure-access-and-mutatio). –