Rozważmy tę funkcję:Czy optymalizator Haskell wykorzystuje zapamiętywanie dla powtarzających się wywołań funkcji w zakresie?
f as = if length as > 100 then length as else 100
Ponieważ funkcja jest czysta to oczywiste, że długość będzie taka sama w obu połączeń. Moje pytanie brzmi: czy optymalizator Haskella zamienia powyższy kod na odpowiednik poniższych?
f as =
let l = length as
in if l > 100 then l else 100
Jeśli tak, to jakie ustawienie poziomu to umożliwia? Jeśli nie, to dlaczego? W tym scenariuszu marnowanie pamięci nie może być przyczyną wyjaśnioną w this answer, ponieważ wprowadzona zmienna zostanie zwolniona zaraz po zakończeniu wykonywania funkcji.
Należy pamiętać, że to nie jest duplikatem this question powodu zasięgu lokalnym, a tym samym może dostać zupełnie inną odpowiedź.
Mimo tego problemu ghc może być znacznie bardziej agresywny w przypadku CSE. Musisz tylko oszacować wartość wartości CSE. Prostym oszacowaniem jest, że typy bazowe zajmują pomijalne miejsce. – augustss
@augustss Zgoda. – kosmikus
W jaki sposób 'length [1 .. 1000000]> 0' jest tanią operacją? Czy "długość" nie powróci zanim ">" zostanie ocenione?(W ghci operacja jest spowolniona zauważalnie, gdy zwiększam rozmiar listy) –