Форум программистов, компьютерный форум CyberForum.ru

Каррирование или карринг - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Принадлежность точки заштрихованной области http://www.cyberforum.ru/cpp-beginners/thread451208.html
создать программу, которая проверяет принадлежность точки заштрихованной области. помогите кому не трудно. http://s018.***********/i512/1202/d5/82b2190b05ec.png
C++ Простая, но объемная прога. Обработка текста на с++ (различные виды сортировки слов) Сам файл с которого происходит считывание вложен. Само задание выглядит так: Программа должна открыть файл Go.txt и считать с него текстовую информацию в виде отдельных слов. Запомнить данные в классе в виде массива слов . Отсортировать массив по алфавиту. После этого проверить элементы массива – если слова повторяются несколько раз, то элементы дубли надо удалить, но запомнить для слова... http://www.cyberforum.ru/cpp-beginners/thread451205.html
C++ Списки
вопрос, в каких случаях используют односвязный список заместо двух связного?
C++ Командная строка
Нужно выполнить задание, но как не пойму... Ввести n строк , найти самую короткую и самую длинную строки. Вывести найденные строки и их длину. Ввод осуществить как аргументы командной строки. Подскажите, как сам ввод сделать, в нете ничего не нашел(((
C++ Написать программу,которая находит среднее значение массива целых чисел при помощи функции http://www.cyberforum.ru/cpp-beginners/thread451189.html
Написать программу,которая находит среднее значение массива целых чисел при помощи функции. (на С++)
C++ Получить сумму m последних цифр числа n. Даны натуральное n,m. Получить сумму m последних цифр числа n. Решите на С.Заранее спасибо. подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
23.02.2012, 10:40     Каррирование или карринг
Возьмем такой гипотетический пример: у нас есть функция map_list, которая принимает список (массив) и одноместную функцию и применяет эту функцию к каждому элементу массива. Есть функция plus, которая возвращает сумму двух чисел. Определить функцию, которая будет увеличивать каждый элемент списка на 3, с использованием вышеопределенных функций.
Решение с C (без каррирования):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>
 
void map_list(int* array, size_t size, int (*pfunc) (int))
{
    size_t i;
 
    for(i = 0; i < size; ++i)
    array[i] = pfunc(array[i]);
}
 
int plus(int a, int b)
{
    return a + b;
}
 
int plus_3(int a)
{
    return plus(a, 3);
}
 
int main(void)
{
    size_t i;
    int array[5] = {1,2,3,4,5};
            
    map_list(array, 5, plus_3);
 
    for(i = 0; i < 5; ++i)
    printf("%d\n", array[i]);
 
    exit(0);
}
Решение на C++ (каррирование через лямбды):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
void map_list(int* arr, size_t size, int (*pfunc) (int))
{
    size_t i;
 
    for(i = 0; i < size; ++i)
    arr[i] = pfunc(arr[i]);
}
 
int plus(int a, int b)
{
    return a + b;
}
 
int main()
{
    int arr[5] = {1,2,3,4,5};
    
    map_list(arr, 5, [=](int a){return plus(a, 3);});
    
    for(size_t i = 0; i < 5; ++i)
    std::cout << arr[i] << std::endl;
}
Решение на C++ («каррирование» через функциональные адаптеры):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <functional>
 
template <typename PFUNC>
void map_list(int* arr, size_t size, PFUNC pfunc)
{
    size_t i;
 
    for(i = 0; i < size; ++i)
    arr[i] = pfunc(arr[i]);
}
 
int plus(int a, int b)
{
    return a + b;
}
 
int main()
{
    int arr[5] = {1,2,3,4,5};
    
    map_list(arr, 5, std::bind1st(std::ptr_fun(plus), 3));
    
    for(size_t i = 0; i < 5; ++i)
    std::cout << arr[i] << std::endl;
}
Common Lisp:
Lisp
1
2
3
4
5
6
7
8
(defun map_list (fun list)
  (reduce (lambda (item acc)
        (cons (funcall fun item) acc))
      list :from-end t :initial-value nil))
 
(defun plus (a b) (+ a b))
 
(format t "~{~d~%~}" (map_list (lambda (a) (plus a 3)) '(1 2 3 4 5)))
Haskell (все функции уже автоматически каррированы, т.е. для того, чтобы получить специализированную версию функции, нужно просто передать ей первые несколько аргументов):
Код
import System.IO (print)
import Control.Monad (mapM_)

map_list :: (a -> b) -> [a] -> [b]
map_list f = foldr (\item acc -> f item : acc) []

plus :: Integral a => a -> a -> a
plus = (+)

main :: IO ()
main = mapM_ print $ map_list (plus 3) [1,2,3,4,5]
Питон:
Python
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
 
def map_list(fun, lst):
    for i in range(len(lst)):
        lst[i] = fun(lst[i])
    return lst
 
def plus(a, b):
    return a + b
 
print(*map_list(lambda a: plus(a, 3), [1,2,3,4,5]), sep='\n')
PS. в C++, CL, Haskell, Python уже есть функции, аналогичные map_list
 
Текущее время: 02:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru