まず第一に、あなたはスペースが恋しいです!それは重要です。
in
第二に、あなたはから忘れますlet ... in
。in
-表記では使用できませんdo
でした:
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
そして、私たちは1つのブロックで団結します。4番目です。
第 5 に、ループの引数は 2 つではなく 3 つです。
loop 0 xs total = return total
第六に、(!!) 0から働くけど、1から使うんだよ(xs !! (n -1))
ね
第7に、モナドを使う必要はなく、再帰だけです。return
だから、から取り除くdo
第8。あなたは無限再帰を持っていますtotal = total + smth
第 9 に、引数をタプルとして使用できないため、最終的な作業結果は次のようになります。
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)