我刚刚在2天前创建了Haskell,所以我还不确定如何优化我的代码.
作为练习,我已经改写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)
) )
Run Code Online (Sandbox Code Playgroud)
我唯一关心的是我怀疑Haskell不能在这里应用尾调用优化,因为递归调用不是在函数结束时进行的.
如何优化尾调用?Haskell的内置foldl实现是否与我的实现方式不同?
我在以下程序中编写一个简单的哈希树结构hash_lookup.hs:
module Main where
data (Eq a) => HashTable a b = HashChildren (a, [HashTable a b]) | Hash (a, b) deriving (Show)
getKey :: HashTable a b -> a
getKey (HashChildren (k, hs)) = k
getKey (Hash (k, h)) = k
lookUp :: [a] -> HashTable a b -> Maybe (HashTable a b)
lookUp [] table = return table
lookUp _ (Hash _) = Nothing
lookUp (p:path) (HashChildren (_, ts) ) = lookUp path ( head ( …Run Code Online (Sandbox Code Playgroud)