2012-11-20 16 views
8

Ogólnie unika się foldl na rzecz foldl' lub foldr. Cytowanie Real World Haskell:Dlaczego niektóre funkcje Prelude są zdefiniowane w kategoriach foldl?

Ze względu na zachowanie thunking z foldl, że jest mądry, aby uniknąć tego funkcję w rzeczywistych programów: nawet jeśli nie powiedzie wprost, to być niepotrzebnie nieefektywne. Zamiast tego zaimportuj Data.List i użyj foldl '.

Jednak niektóre funkcje Prelude są zdefiniowane pod tym względem (np. (\\) i unionBy). Dlaczego to? Czy nie należy wprowadzać zbyt wiele rygorów w tych funkcjach?

+0

Uwaga: analiza ścisłości w GHC oznacza, że ​​'foldl' działa lepiej niż mogłoby się wydawać zaskakująco często. – singpolyma

+0

Ściśle mówiąc, '(\\)' i 'unionBy' nie znajdują się w Preludium. – sdcvvc

Odpowiedz

13

Preludium zostało zaprojektowane przed foldl' istniało i od tego czasu istnieje presja, aby zachować kompatybilność wsteczną (w odniesieniu do surowości, jak wspomniano wcześniej).

+0

To interesujące. Czy radzi się nie używać propagacji 'foldl'? Mam na myśli, czy powinniśmy również unikać '(\\)' i 'unionBy'? – Tarrasch

+0

@ Tarrasch Często, tak, zwłaszcza z fałdami numerycznymi. Często stosuje się 'sum '= foldl' (+) 0' i takie rzeczy w każdym projekcie, który ich potrzebuje. –

+0

@DanielWagner: faktycznie, 'sum' nie jest zdefiniowane w terminach' foldl' oprócz 'USE_REPORT_PRELUDE': http://hackage.haskell.org/packages/archive/base/4.6.0.0/doc/html/src /Data-List.html#sum – amindfv

4

W obu przypadkach akumulator jest typu [a]. Nie widzę, aby wymuszenie listy na słabej normalnej formie miało duże znaczenie, a wprowadzenie takiej częściowej ścisłości wydaje się dość arbitralne.

10

W przypadku (\\) i unionBy, funkcja złożona ma typ

foo :: [a] -> b -> [a] 

i foo xs y usuwa co najwyżej jeden element z xs, więc korzystanie foldl' nie kupować niczego tam w ogóle, łącznikami zostanie zbudowany po prawej stronie najwyższego numeru (:) zamiast nad nim.

Nie zaszłyby żadne zmiany pod względem ścisłości, o ile widzę, oba fałdy byłyby oceniane tylko wtedy, gdy wynik wymaga oceny na słabej normalnej formie głowy, a gdy foldl' wytworzyłby _|_, więc będzie foldl.

Powiązane problemy