首先 - 你错过了空间!这很重要。
其次,你忘记了in
从let ... in
. 我们不能使用in
in do
-notation:
sumsq (x:xs) =
let total = 0 in
loop length(x:xs) (x:xs) total
第三,您不要使用x
andxs
形式(x:xs)
:
sumsq xs =
let total = 0 in
loop (length xs) xs total
我们团结length xs
在一个街区。它是第四个。
第五,我们有 3 个,而不是 2 个循环参数:
loop 0 xs total = return total
第六,(!!)从 0 开始工作,但你从 1 开始使用它,所以(xs !! (n -1))
是对的
第七,你不需要使用 monad,只需要递归。所以,摆脱return
和do
第八。你有无限递归total = total + smth
第九,我们不能使用参数作为元组,所以,你最终的工作结果是:
sumsq xs =
let total = 0 in
loop (length xs) xs total
loop 0 xs total = total
loop n xs total = loop (n-1) xs total1
where
sq = (xs !! (n -1)) ^2
total1 = total + sq
更新
如果我们谈论的是复杂性,那就不好了——O(n^2)
正如评论中提到的那样:对于每个元素,我们都在寻找这个元素。我们可以简化循环函数并去掉n
参数:
loop [] total = total
loop (x:xs) total = loop xs total1
where
sq = x ^ 2
total1 = total + sq
以及sumsq
我们编写的函数:
sumsq xs = loop xs 0
PS这是一个更容易实现的功能sumsq = sum. map (^ 2)