Я новичок в Haskell и пытаюсь реализовать функцию с аккумулятором, но не знаю, как правильно ее использовать.
Вот функция, использующая список чисел и возвращающая тройку (Int, Int, Int) с длиной, суммой и суммой квадратов списка с помощью встроенной функции:
stats1 :: [Int] -> (Int,Int,Int)
stats1 xs = (length xs, sum xs, sumsq xs)
sumsq :: [Int] -> Int
sumsq [] = 0
sumsq (x:xs) = (^2) x + sumsq xs
Однако, когда я попытался использовать аккумулятор:
stats2 :: [Int] -> (Int,Int,Int)
stats2 [] = (0,0,0)
stats2 (x:xs) = (len+1, acc+x, sumsquare + x*x ) (stats2 xs)
where len = 0
acc = 0
sumsquare = 0
Я получил сообщение об ошибке:
Couldn't match expected type ‘(Int, Int, Int) -> (Int, Int, Int)’
with actual type ‘(Integer, Int, Int)’
The function ‘(len + 1, acc + x, sumsquare + x * x)’
is applied to one argument,
but its type ‘(Integer, Int, Int)’ has none
In the expression:
(len + 1, acc + x, sumsquare + x * x) (stats2 xs)
In an equation for ‘stats2’:
stats2 (x : xs)
= (len + 1, acc + x, sumsquare + x * x) (stats2 xs)
where
len = 0
acc = 0
sumsquare = 0
Как я мог достичь той же цели из stats1
с помощью аккумулятора? Спасибо.