Minha função folded reescrita está otimizada?
Eu acabei de começar o Haskell 2 dias atrás, então ainda não tenho certeza sobre como otimizar meu código.
Como exercício, reescrevifoldl
efoldr
( Eu dareifoldl
aqui masfoldr
é o mesmo, substituindolast
comhead
einit
comtail
).
O código é:
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)
) )
Minha única preocupação é que eu suspeito que Haskell não pode aplicar a otimização da chamada de ponta aqui porque a chamada recursiva não é feita no final da função.
Como posso tornar esta ligação otimizada? A implementação incorporada de Haskell éfoldl
implementado de forma diferente para o meu?