Оптимизирована ли моя переписанная функция foldl?

Я только начал использовать 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реализовано иначе, чем у меня?

7
задан GabrielG 21 June 2012 в 18:57
поделиться