Если вы посмотрите на определение sum
, это просто sum = foldl (+) 0
.Поэтому, если вы замените sum
на foldl (+) 0
в любом из ваших решений, у вас есть решение, использующее foldl
.
. Вы также можете избавиться от необходимости использовать списки или map
, используя foldl
с функцией, которая добавляет квадрат своего второго аргумента к своему первому аргументу.
Я не уверен, в чем заключаются ваши соображения по поводу рекурсивных функций.Если вы используете foldl
, вам не нужно использовать рекурсию (за исключением случаев, когда foldl
реализован с использованием рекурсии).
Однако вы не правы, что рекурсивной функции потребуется триАргументы: Рекурсивные функции, суммирующие квадраты каждого элемента в списке, наиболее просто реализуются, беря список и добавляя заголовок списка к результату вызова функции в хвосте списка.Базовый случай squareSum [] = 0
.Это не имеет ничего общего с foldl
, однако.