Добавление степеней чисел в haskell с помощью foldl - PullRequest
1 голос
/ 18 ноября 2010

Меня просят сделать функцию haskell, которая вычисляет что-то вроде

1^2 + 2^2 + 3^2 ...

Хотя это довольно легко реализовать с помощью списочных представлений

sum [ k^2 | k <- [1..100]]

или карты

sum (map (\x -> x*x) [1..100])

Мне трудно понять, как этого добиться с помощью фолдлов.

Если я не ошибаюсь, в рекурсивной функции нужно не менее 3-х параметров, чтобы добиться результата с этим:

  1. Текущая позиция (1 ... до n)
  2. Текущая сумма
  3. Где остановиться

Даже если я определю эту функцию, она все равно вернет кортеж, а не число (как мне нужно!).

Может ли кто-нибудь быть настолько любезным, чтобы дать мне некоторые подсказки о том, чего мне не хватает?

Спасибо

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

Если вы посмотрите на определение sum, это просто sum = foldl (+) 0.Поэтому, если вы замените sum на foldl (+) 0 в любом из ваших решений, у вас есть решение, использующее foldl.

. Вы также можете избавиться от необходимости использовать списки или map, используя foldl с функцией, которая добавляет квадрат своего второго аргумента к своему первому аргументу.

Я не уверен, в чем заключаются ваши соображения по поводу рекурсивных функций.Если вы используете foldl, вам не нужно использовать рекурсию (за исключением случаев, когда foldl реализован с использованием рекурсии).

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

5 голосов
/ 18 ноября 2010

«Текущая позиция» (на самом деле следующий элемент в списке, как в вашей версии карт и списков) и то, где остановиться, подразумеваются в сворачиваемом списке. Текущая сумма является «накопительным» параметром сгиба. Итак, заполните бланк:

foldl (\runningSum nextNumber -> ____) 0 [1..100]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...