Оптимизирована ли моя переписанная функция 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
Реализовано ли иначе?