Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
1

Теория-практика: накопление суммы в "чисто" функциональных ЯП

02.03.2017, 16:44. Показов 1324. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Согласно теории, в Haskell, как и в ему подобных ЯП, конструкция S = S + A[i] (где то так...) не может работать!
Т.Е. есть проблема как осуществить накопление суммы...
Я думаю о следующем - создаётся список нулевой длины и ему раз за разом присваивается значение функции
находящейся в "цикле", после его окончания получившийся список, точнее его элементы, суммируются и таким
образом мы обходим "проблему суммирования"...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2017, 16:44
Ответы с готовыми решениями:

λ-выражения (чисто теория)
Недавно начал учить С# и добрался до делегатов, анонимных методов и лямбда выражений. Вроде немного...

Накопление суммы
помогите пожалуйста решить задачую Никогда с накоплением не работал

Накопление суммы, произведения
нужен пример по накоплению суммы и произведения по с++

Теория и практика
Моё почтение всем трудягам и работягам. Моги бы подсказать набор или что можно изобрести, чтобы...

Теория и практика
Здравствуйте. Читаю книгу для начинающих, по изучению языка пайтон, тема ,,кортежи и их...

6
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
02.03.2017, 17:05 2
Решите сначала последнию задачу, найдите сумму элементов списка.
Возможно, первая задача у Вас решится сама собой по аналогии.
2
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
02.03.2017, 17:06 3
Цитата Сообщение от Slenon Посмотреть сообщение
Т.Е. есть проблема
Никаких проблем нет. Для начала попробуйте просуммировать несколько значений без деструктивного присваивания, написав кота на любом известном вам языке.
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
02.03.2017, 17:59 4
Суммировать массив без сакраментального "s=s+a[i]" можно в любом языке. Например, вот два варианта, как это может выглядеть в C/С++:

C
1
2
3
4
5
6
7
8
9
10
int sum_arr_1(int *Arr, int n) // простая рекурсия
{
    return (n==0)?0:Arr[0]+sum_arr_1(Arr+1,n-1);
}          
 
int sum_arr_2(int *Arr, int n,int s) // хвостовая рекурсия с накопительным 
                                              // параметром
{
    return (n==0)?s:sum_arr_2(Arr+1,n-1,s+Arr[0]);
}
Соответственно, в Haskell это может выглядеть так:

Haskell
1
2
3
4
5
sum_list_1 [] = 0
sum_list_1 (x:xs) = x + sum_list_1 xs
 
sum_list_2 [] acc = acc
sum_list_2 (x:xs) acc = sum_list_2 xs (acc+x)
Добавлено через 1 минуту
Но проще, конечно, вот так:

Haskell
1
sum_list = sum
3
Заблокирован
04.03.2017, 11:58 5
Цитата Сообщение от Slenon Посмотреть сообщение
Согласно теории, в Haskell, как и в ему подобных ЯП, конструкция S = S + A[i] (где то так...) не может работать!
Т.Е. есть проблема как осуществить накопление суммы...
Никак. Накопление невозможно уже потому, что невозможно состояние.
Можно имитировать это. То есть условно считать, что каждая последующая новая сумма является "тем же самым аккумулятором". Но "считать" так может только внешний наблюдатель, на уровне семантики ФП это абстрагировать невозможно

Добавлено через 24 минуты
Кстати, если интересует, какие еще ограничения имеются в ФП, помимо абстракции состояния и времени -- это конкурентрые вычисления. Они тоже не могут быть описаны в рамках семантики ФП.

Например, пусть у нас есть выражение foo(bar). Если это выражение выполняется конкурентно, то очевидно, что нам нужны механизмы синхронизации, поскольку foo не может быть вычисленно до тех пор, пока не вычесленно bar. То есть, нам нужно что то-вроде того, что после запуска этого выражения, сначала ставится задача на вычисление bar, а пока оно вычисляется (и одновременно с этим вычисляется другой код) foo "ждет" результат этого вычисления. Однако, в семантике чистого ФП нет никаких определений для описания механизмов такой синхронизации(futures etc). Впрочем, если бы эти определения были, было бы странно, так как мы были бы вынужденны ввести понятие "время"
0
Curry
04.03.2017, 12:37
  #6
0
Заблокирован
04.03.2017, 13:24 7
Цитата Сообщение от Slenon Посмотреть сообщение
Я думаю о следующем - создаётся список нулевой длины и ему раз за разом присваивается значение функции
находящейся в "цикле", после его окончания получившийся список, точнее его элементы, суммируются и таким
образом мы обходим "проблему суммирования"...
Во-первых, в ФП циклов тоже нет.
Во-вторых, так имитировать аккумулятор невозможно, потому что аккумулятор в общем случае, не обязан накапливаться последовательно или синхронно, он может дергаться из совершенно различных мест программы
0
04.03.2017, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2017, 13:24
Помогаю со студенческими работами здесь

Накопление суммы в циклическом алгоритме
лабораторная работа NЗ. Общее задание: разработать алгоритм и программу, реализующую накопление...

Как реализовать накопление суммы
Как реализовать накопление суммы(К примеру как в интернет магазинах)

Теория и практика вероятностей
Где-то увидел задачку:В чём некорректность данной задачи? Дополните условие, чтобы убрать...

Г.Шилдт. Теория и практика С++
Кто-нибудь дайте бесплатную ссылку на книгу: Г.Шилдт. Теория и практика С++....

Вычислить, используя накопление суммы: y = x + 2x + 4x + 16x...
Даны действительное число x и натуральное число n. Вычислить, используя накопление суммы: y = x +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru