Программист
|
|
1 | |
Каррирование или карринг23.02.2012, 00:38. Показов 4541. Ответов 12
Метки нет (Все метки)
Определение с вики какое-то мутное, кто может объясните пожалуйста поподробнее - что это, для чего и когда применять.
0
|
23.02.2012, 00:38 | |
Ответы с готовыми решениями:
12
Карринг без налипания типа Каррирование Каррирование Каррирование в JavaScript |
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
|
|
23.02.2012, 08:49 | 2 |
Насколько я понял по википедии - это функция внутри функции.
1
|
60 / 21 / 2
Регистрация: 23.02.2012
Сообщений: 36
|
||||||
23.02.2012, 09:12 | 3 | |||||
Есть функция с n аргументами.
Карринг - преобразание одного вызова с n аргументами в n вызовов с одним аргументом. Карринг популярен в динамических языках, где функция является присваиваемым объектом. Функция является присваиваемым объектом, если я могу записать нечто вроде a = x*x, потом вызвать a(5) и получить 25. Каррингом можно "замораживать" аргументы. Пусть есть функция inc(a, b), которая увеличивает a на b. Я могу сделать так (пример на python):
lambda x, y : x + y -> функция, принимающая x и y, и складывающая их. ____________ zmartzoft.ru
2
|
Higher
|
|||||||||||
23.02.2012, 09:19 | 4 | ||||||||||
Тоже наткнулся на эту статью в вики. Единственное применение, которое я ей нашел - https://www.cyberforum.ru/post2461887.html
Ну и насколько я понял, это просто способ писать вместо
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
23.02.2012, 09:57 | 5 |
Каррирование — это практика, которая позволяет (в основном, в функциональных ЯП) на основе более общих функций строить их частные версии, фиксируя значения части их аргументов. Основное использование — для передачи в функции высшего порядка. Можно использовать в языках с полноценными замыканиями (т.е. в С не получится, но в C++ можно использовать для этих целей лямбды), либо с помощью костылей (функциональные адаптеры в C++).
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||||||||||||||||||||
23.02.2012, 10:40 | 6 | |||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Возьмем такой гипотетический пример: у нас есть функция map_list, которая принимает список (массив) и одноместную функцию и применяет эту функцию к каждому элементу массива. Есть функция plus, которая возвращает сумму двух чисел. Определить функцию, которая будет увеличивать каждый элемент списка на 3, с использованием вышеопределенных функций.
Решение с C (без каррирования):
Код
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]
6
|
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
|
|
23.02.2012, 11:09 | 7 |
[
Не по теме: b]Nameless One[/b], вы сами написали все эти примеры?
0
|
Nameless One
|
23.02.2012, 11:09
#8
|
Не по теме: Mayonez, да, а что такое?
0
|
Mayonez
|
23.02.2012, 11:11
#9
|
Не по теме: круто, знать на таком уровне столько языков
0
|
Nameless One
|
23.02.2012, 11:12
#10
|
Не по теме: Mayonez, это уровень Helloworld'ов :D
0
|
Mayonez
|
23.02.2012, 11:20
#11
|
Не по теме: Nameless One, я понимаю вашу иронию: чем дольше изучаю с++, тем больше понимаю, что знаю я очень мало, но согласитесь, надпись у вас в статусе "Эксперт C++" все же о чем то говорит (не просто об умении написать hello world)
0
|
Программист
|
|
23.02.2012, 11:52 [ТС] | 12 |
То есть, как я понял, каррирование это использование функции с несколькими аргументами(часть которых мы задаём заранее не переделывая основную функцию, но задавая её частную версию), как аргумента функции высшего порядка?
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
23.02.2012, 11:56 | 13 |
Whiteha, можно сказать и так, правда, не обязательно "как аргумента функции высшего порядка" (хотя это и наиболее частый случай использования каррированных функций).
1
|
23.02.2012, 11:56 | |
23.02.2012, 11:56 | |
Помогаю со студенческими работами здесь
13
For_each, итераторы, каррирование, шаблоны Для чего нужно каррирование? Каррирование, как запомнить предыдущий результат Каррирование: что дает, как применять, где использовать? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |