Здравствуйте, ecinunice, Вы писали:
E>Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, ecinunice, Вы писали:
E>>Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?
К>А о чём конкретно речь? О карринге?
Коллегам был продемонстрирован пример частичного применения на Nemerle, посмотрев на него они сказали, что не видят существенной разницы между
def f( x, y) {
...
}
def g = f( x, _)
и
def f( x, y) {
...
}
def g ( y ) {
f( x, y)
}
Вот и возник вопрос — есть ли такие особенности частичного применения, которые не нельзя приклеить ярлык синтаксического сахара (конкретный язык не важен).
Здравствуйте, ecinunice, Вы писали:
E>Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?
Чистый сахор, но приемущества есть. Значительно более читабельно получается. Скажем если нам нужно куда-то передать фунцию сравнения, то вместо:
def result = lst.Filter((x, y) => x == y);
Можно писать:
def result = lst.Filter(_ == _);
Соответственно упращаются и остальные случаи применения, а код становится понятнее.
ЗЫ
Вообще частичное прменение есть пока что только в Немерле. Так что вопрос можно было задавать в его форуме.
В языках ML-но группы аналогом является карринг.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Чистый сахор, но приемущества есть. Значительно более читабельно получается. VD>Соответственно упращаются и остальные случаи применения, а код становится понятнее.
Тут главный вопрос — не переборщить с этими по сути анонимными функциями, иначе понятность может ухудшиться.
Здравствуйте, VladD2, Вы писали:
VD>В языках ML-но группы аналогом является карринг.
Почему, на Ваш взгляд, в N ввели свой термин, а не воспользовались устоявшимся?
PS: Меня смущает слово применение — оно наводит на мысль, что вот такой тест
mutable i = 0;
def f (a, b){
i = i + 1; // частично применилось один раз при создании g
a + b
}
def g = f (10, _ );
WriteLine(g ( 1 ));
WriteLine($"i: $i");
WriteLine(g ( 1 ));
WriteLine($"i: $i");
должен выводить
11
i: 1
11
i: 1
a выводит, естественно,
11
i: 1
11
i: 2
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, ecinunice, Вы писали:
E>>PS: Меня смущает слово применение — оно наводит на мысль, что вот такой тест E>>
E>> mutable i = 0;
К>[cut]
E>>
К>Mutable — зло, как раз тут у тебя проявляется то, что он делает reasoning по поводу кода неприменимым.
Т.е. можно предоставить пример, в котором reasoning кода будет применимым? Можно линк или сам пример?
Здравствуйте, ecinunice, Вы писали:
E>Т.е. можно предоставить пример, в котором reasoning кода будет применимым? Можно линк или сам пример?
Вообще это обширная тема и я не уверен, что очень хорошо в ней ориентируюсь, глянь к примеру долклад Дениса о бесплатных теоремах
Кроме частичного применения есть частичные вычисления, вот глянь книжку, там суть в том, что можно часть программы предвычислить до её выполнения. Фактически статическая типизация является частным случаем, там по сути выкидываются проверки типов, в отличие от языков с динамической типизацией.
Здравствуйте, VladD2, Вы писали:
VD>Чистый сахор, но приемущества есть. Значительно более читабельно получается. Скажем если нам нужно куда-то передать фунцию сравнения, то вместо: VD>
VD>def result = lst.Filter((x, y) => x == y);
VD>
VD>Можно писать: VD>
VD>def result = lst.Filter(_ == _);
VD>
VD>Соответственно упращаются и остальные случаи применения, а код становится понятнее.
Здравствуйте, Lloyd, Вы писали:
L>Лично мне — нет. С лямбда-синтаксисом еще куда ни шло...
А в чем разница.
Filter ждёт бинарного предиката, он туда и засовывается: _==_. Подчёркивания замещают аргументы. Я Nemerle не знаю, но мне так вполне понятно. Функциональщина же нынче не дикая экзотика.
Здравствуйте, VladD2, Вы писали:
VD>Вообще частичное прменение есть пока что только в Немерле. Так что вопрос можно было задавать в его форуме. VD>В языках ML-но группы аналогом является карринг.
В Хаскелле частичное применение — устойчивый термин, и стандартный ход в программировании. Там просто вообще не надо даже _ (подчеркивание) для "неприменённых" аргументов указывать, поскольку арность идентификатора не перегружается.
А карринг в Хаскелле (и вообще в ML) это преобразование функции от кортежа в ФВП одного аргумента
-- было
f :: (a, b) -> c
-- стало
(curry f) :: a -> (b -> c)
Получившаяся curry f допускает частичное применение по-хаскеллски: применили к x типа a — получили (curry f x) :: b -> c. Например
-- функция от кортежа
sumTuple :: (Integer, Integer) -> Integer
sumTuple (x,y) = x + y
-- каррируем
sum :: Integer -> Integer -> Integer
sum = curry sumTuple
-- применяем частично
add42 :: Integer -> Integer
add42 = sum 42
-- add42 5 вернёт 47
Другое дело, что в Хаскелле почти все функции и так уже каррированные, поэтому их вполне себе частично применяют за глаза и за уши.
Здравствуйте, deniok, Вы писали:
D>А карринг в Хаскелле (и вообще в ML) это преобразование функции от кортежа в ФВП одного аргумента
В Окамле еще страшнее, есть только функции от одного аргумента, а функции от многих аргументов чистый сахар например функция от двух аргументов это реально функция от первого аргумента выдающая как результат функцию (каррированую) к которой можно применить второй аргумент:
# let f x y = x + y;;
val f : int -> int -> int = <fun>
# f 1;;
- : int -> int = <fun>
Здравствуйте, ecinunice, Вы писали:
E>Здравствуйте, Курилка, Вы писали:
К>>Здравствуйте, ecinunice, Вы писали:
E>>>Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?
К>>А о чём конкретно речь? О карринге?
E>Коллегам был продемонстрирован пример частичного применения на Nemerle, посмотрев на него они сказали, что не видят существенной разницы между E>
E>def f( x, y) {
E> ...
E>}
E>def g = f( x, _)
E>
E>и
E>
E>def f( x, y) {
E> ...
E>}
E>def g ( y ) {
E> f( x, y)
E>}
E>
E>Вот и возник вопрос — есть ли такие особенности частичного применения, которые не нельзя приклеить ярлык синтаксического сахара (конкретный язык не важен).
Если f — фиксирована, то разницы, в общем-то, нет. А вот если f является переменной, то таки разница есть. На втором шарпе идея g будет выглядеть примерно так:
public delegate void OneArgument<T>(T arg);
public delegate void TwoArguments<T1, T2>(T1 arg1, T2 arg2);
public OneArgument<T2> g(TwoArguments<T1, T2> f, T1 arg1)
{
return delegate(T2 arg2) { return input(arg1, arg2); };
}
Как видим, это немножечко более громоздко, чем прямая поддержка частичного применения в синтаксисе.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.