Czy moja przepisana funkcja foldl została zoptymalizowana?
Właśnie zacząłem Haskell 2 dni temu, więc nie jestem jeszcze pewien, jak zoptymalizować mój kod.
Jako ćwiczenie przepisałemfoldl
ifoldr
( Ja damfoldl
tutaj alefoldr
jest taki sam, zastępująclast
zhead
iinit
ztail
).
Kod to:
module Main where
myFoldl :: ( a -> ( b -> a ) ) -> a -> ( [b] -> a )
myFoldl func = ( \x -> (\theList
-> if (length theList == 0) then
x
else
myFoldl func (func x (last theList) ) (init theList)
) )
Moim jedynym zmartwieniem jest to, że podejrzewam, że Haskell nie może tutaj zastosować optymalizacji połączeń ogonowych, ponieważ wywołanie rekurencyjne nie jest wykonywane na końcu funkcji.
Jak mogę zoptymalizować to połączenie ogonowe? Czy wbudowana implementacja Haskellafoldl
realizowany inaczej niż mój?