Haskell方法太慢了

时间:2013-12-13 00:12:26

标签: haskell optimization

我在Haskell中编写了一个函数,如下所示:

maxSumme :: [[Int]] -> Int
maxSumme [] = 0
maxSumme (x:l) = if subSumme x < maxSumme l then maxSumme l else subSumme x

subSumme :: [Int] -> Int
subSumme [] = 0             
subSumme (x:l) = x + subSumme(l)

-- function call
maxSumme [[7,2,4],[5,8,1],[7,9,2]] -- with 25 innerLists

我测试了它,但这种方法非常慢。如果我使用包含3个项目的25个内部列表的列表来调用它,则需要花费一分钟来计算maxSumme。那不正常不是吗?我一定犯了一个错误,但我找不到。我该如何优化我的方法?有更快的方法吗?

编辑:我认为发现了错误。我确信这是maxSumme l then maxSumme l。我经常每次循环遍历列表,这需要很长时间。但实际上我不知道如何避免这种情况。

1 个答案:

答案 0 :(得分:3)

所以你找到了问题功能。这是因为对于每个列表,您多次调用subSumme。您可以做的是将subSumme映射到传递给maxSumme的每个列表,然后找到这些数字的最大值:

maxSumme xs = maximum $ map subSumme xs

如果你不能使用maximum,你需要弄清楚如何自己实现= P


要解释$运算符,它意味着始终在左侧之前运行所有内容。它表达式像

f (g (h (i (j (k (l x))))))

f $ g $ h $ i $ j $ k $ l x

请注意,使用多个参数的函数会变得棘手。这不会编译

map $ (1+) $ replicate 10 1

因为它与

相同
  map ((1+) (replicate 10 1))
= map ((1+) replicate 10 1))
= map (1 + replicate 10 1)
= map (1 + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
         ^------ Can't add a number to a list!

但你可以做到

map (1+) $ replicate 10 1

基本上,所有这些都是在很多情况下不需要括号。