Jeśli chcemy zmapować funkcję, która zwiększa każdy element szeregu 1, moglibyśmy napisaćcurrying odejmowanie
map (\x -> x + 1) [1..5]
ale myślę, że większość ludzi po prostu pójść na
map (+1) [1..5]
zamiast. Ale to oczywiście nie działa z (-1), ponieważ jest to negatywne.
Tak więc pierwszą rzeczą, która przyszła mi do głowy było
map (+(-1)) [1..5]
które miałoby sensu biorąc pod uwagę jak odejmowanie jest zdefiniowana w Prelude (x - y = x + negate y
), ale wygląda to nieco dziwne dla mnie. Potem wymyśliłem:
To wydaje mi się lepsze, ale może trochę zbyt skomplikowane.
Teraz wiem, że to nic wielkiego, ale zastanawiam się, czy brakuje mi bardziej oczywistego sposobu na napisanie tego? Jeśli nie, który z 2 sposobów chciałbyś? Naprawdę tylko pytam, ponieważ często są to drobne szczegóły, które sprawiają, że twój kod jest bardziej idiomatyczny, a przez to przyjemny dla innych programistów, którzy muszą go przeczytać.
Rozwiązanie
Teraz mam kilka odpowiedzi, myślę, że mój osobisty faworyt
map (subtract 1) [1..5]
następnie
map pred [1..5]
głównie dlatego, że pierwszy z nich jest bardzo wyraźny i nikt nie musi zgadywać/szukać tego, co znaczy pred
(poprzednik).
mała uwaga: problem nie jest currying, to składnia sekcja operator.'(-) 1' jest (syntaktycznie poprawnym) sposobem na częściowe zastosowanie funkcji curry' -'. –
Walczyłem o tytuł i nie mogłem wymyślić nic lepszego. Również 'map ((-) 1) [1..5]' nie działa, stąd wersja z odwróceniem. –
Jeśli są one integralne, a chcesz tylko odjąć 1, dlaczego nie 'map pred' –