tworzę dużo zmiennych tymczasowych w Haskell:Unikaj zmiennych tymczasowych za pomocą nazwy shadowing
main = do
let nums'' = [1..10]
let nums' = a . bunch . of_ . functions $ nums''
let nums = another . bunch . of_ . functions $ nums'
print nums
Oznacza to, że nie chcę, aby napisać długi łańcuch funkcji tak:
let nums = another . bunch . of_ . functions . a . bunch . of_ . functions $ [1..10]
Ponieważ staje się nieczytelne dla mnie, więc staram się pogrupować funkcje zgodnie z tym, co robią. W efekcie powstaje szereg brzydkich zmiennych tymczasowych, takich jak nums''
i nums'
(mogę nadać im bardziej znaczące nazwy, ale punkt wciąż stoi ... każda nowa linia oznacza nową zmienną). Jest to przypadek, w którym zmienna shadowingu spowodowałaby czystszy kod. Chciałbym zrobić coś takiego:
let nums = [1..10]
nums = a . bunch . of_ . functions $ nums
nums = another . bunch . of_ . functions $ nums
tj. dokładnie tak samo jak powyżej, ale bez zmiennych tymczasowych. Czy jest jakiś sposób, aby to zrobić w Haskell? Być może cała sprawa może być owinięty w „transakcji”:
atomically $ do
(...this code...)
return nums
coś, co pozwoli Haskell wiedzieć, że kod w tym punkcie zawierają zmienne shadownigu i powinien martwić się tylko o wyniku końcowym. czy to możliwe?
Można również użyć Monada państwa, jeżeli chcesz przekazać wartość wzdłuż bez mutacji jeszcze nie tworząc kilka nazwisk – amindfv
może Uważam, że (a), jeśli mają znaczenie imiona dają pośrednie kroki, nie ma problemu; oraz (b) jeśli nie masz znaczących nazwisk, aby wykonać pośrednie kroki, nie ma korzyści z ich rozbicia. Z (a) i (b) możemy wywnioskować, że nie ma problemu. To zależy od tego, czy akceptujesz lokal, oczywiście. –
Nie zgadzam się, że ponowne użycie tej samej nazwy dla różnych celów koniecznie czyni ją bardziej czytelną. Teraz czytelnik musi dowiedzieć się, która zmienna wiąże każde wystąpienie. – augustss