Я только начал использовать Haskell 2 дня назад, поэтому пока не уверен, как оптимизировать свой код.
В качестве упражнения я переписал foldl
и foldr
(я приведу здесь foldl
, но foldr
— это одно и то же, заменив last
на head
и init
на tail
.
Код:
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)
) )
Меня беспокоит только то, что я подозреваю, что Haskell не может применить здесь оптимизацию хвостового вызова, потому что рекурсивный вызов не выполняется в конце функции.
Как я могу оптимизировать этот хвостовой вызов? Является ли встроенная реализация Haskell foldl
реализовано иначе, чем у меня?