Частичное применение
От: ecinunice  
Дата: 21.12.07 13:02
Оценка:
Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?
... << RSDN@Home 1.2.0 alpha rev. 737>>
Re: Частичное применение
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.12.07 13:05
Оценка:
Здравствуйте, ecinunice, Вы писали:

E>Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?


А о чём конкретно речь? О карринге?
Re[2]: Частичное применение
От: ecinunice  
Дата: 21.12.07 13:19
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, ecinunice, Вы писали:


E>>Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?


К>А о чём конкретно речь? О карринге?


Коллегам был продемонстрирован пример частичного применения на Nemerle, посмотрев на него они сказали, что не видят существенной разницы между
def f( x, y) {
  ...
}

def g = f( x, _)


и

def f( x, y) {
  ...
}

def g ( y ) {
   f( x, y)
}


Вот и возник вопрос — есть ли такие особенности частичного применения, которые не нельзя приклеить ярлык синтаксического сахара (конкретный язык не важен).
... << RSDN@Home 1.2.0 alpha rev. 737>>
Re[2]: Частичное применение
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.12.07 13:29
Оценка:
Здравствуйте, Курилка, Вы писали:

К>А о чём конкретно речь? О карринге?


Каринг — это в языках безскобок. В Немерле скобочный аналог назвали частичным применением.

Суть — композиция фунций.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Частичное применение
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.12.07 13:29
Оценка:
Здравствуйте, ecinunice, Вы писали:

E>Сводится ли частичное применение к синтаксическому сахару или есть другие приемущества? Если другие приемущества есть — можно привести пример?


Чистый сахор, но приемущества есть. Значительно более читабельно получается. Скажем если нам нужно куда-то передать фунцию сравнения, то вместо:
def result = lst.Filter((x, y) => x == y);

Можно писать:
def result = lst.Filter(_ == _);

Соответственно упращаются и остальные случаи применения, а код становится понятнее.

ЗЫ

Вообще частичное прменение есть пока что только в Немерле. Так что вопрос можно было задавать в его форуме.
В языках ML-но группы аналогом является карринг.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Частичное применение
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.12.07 13:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Чистый сахор, но приемущества есть. Значительно более читабельно получается.

VD>Соответственно упращаются и остальные случаи применения, а код становится понятнее.

Тут главный вопрос — не переборщить с этими по сути анонимными функциями, иначе понятность может ухудшиться.

ЗЫ Частичное вычисление на HaskellWiki, хотя для языков со скобками он будет выглядеть иначе
Re[2]: Частичное применение
От: ecinunice  
Дата: 21.12.07 14:08
Оценка:
Здравствуйте, 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
... << RSDN@Home 1.2.0 alpha rev. 737>>
Re[3]: Частичное применение
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.12.07 14:13
Оценка:
Здравствуйте, ecinunice, Вы писали:

E>PS: Меня смущает слово применение — оно наводит на мысль, что вот такой тест

E>
E>    mutable i = 0;
[cut]
E>


Mutable — зло, как раз тут у тебя проявляется то, что он делает reasoning по поводу кода неприменимым.
Re[4]: Частичное применение
От: ecinunice  
Дата: 21.12.07 14:40
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, ecinunice, Вы писали:


E>>PS: Меня смущает слово применение — оно наводит на мысль, что вот такой тест

E>>
E>>    mutable i = 0;
К>[cut]
E>>


К>Mutable — зло, как раз тут у тебя проявляется то, что он делает reasoning по поводу кода неприменимым.


Т.е. можно предоставить пример, в котором reasoning кода будет применимым? Можно линк или сам пример?
... << RSDN@Home 1.2.0 alpha rev. 737>>
Re[5]: Частичное применение
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.12.07 14:47
Оценка: 21 (2)
Здравствуйте, ecinunice, Вы писали:

E>Т.е. можно предоставить пример, в котором reasoning кода будет применимым? Можно линк или сам пример?


Вообще это обширная тема и я не уверен, что очень хорошо в ней ориентируюсь, глянь к примеру долклад Дениса о бесплатных теоремах
Кроме частичного применения есть частичные вычисления, вот глянь книжку, там суть в том, что можно часть программы предвычислить до её выполнения. Фактически статическая типизация является частным случаем, там по сути выкидываются проверки типов, в отличие от языков с динамической типизацией.
Re[2]: Частичное применение
От: Lloyd Россия  
Дата: 21.12.07 15:28
Оценка: +4
Здравствуйте, VladD2, Вы писали:

VD>Чистый сахор, но приемущества есть. Значительно более читабельно получается. Скажем если нам нужно куда-то передать фунцию сравнения, то вместо:

VD>
VD>def result = lst.Filter((x, y) => x == y);
VD>

VD>Можно писать:
VD>
VD>def result = lst.Filter(_ == _);
VD>

VD>Соответственно упращаются и остальные случаи применения, а код становится понятнее.

Понятнее?
Re[3]: Частичное применение
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.12.07 11:46
Оценка: +1
Здравствуйте, ecinunice, Вы писали:

i = i + 1 никакого отношения к частичному применения/вычислению не имеет. Это заваченая замыканием изменяемая переменная.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Частичное применение
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.12.07 11:46
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Понятнее?


А что нет что ли?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Частичное применение
От: Lloyd Россия  
Дата: 22.12.07 15:55
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>Понятнее?


VD>А что нет что ли?


Лично мне — нет. С лямбда-синтаксисом еще куда ни шло...
Re[5]: Частичное применение
От: deniok Россия  
Дата: 22.12.07 20:46
Оценка: +2
Здравствуйте, Lloyd, Вы писали:

L>Лично мне — нет. С лямбда-синтаксисом еще куда ни шло...


А в чем разница.

Filter ждёт бинарного предиката, он туда и засовывается: _==_. Подчёркивания замещают аргументы. Я Nemerle не знаю, но мне так вполне понятно. Функциональщина же нынче не дикая экзотика.
Re[2]: Частичное применение
От: deniok Россия  
Дата: 22.12.07 23:36
Оценка: 2 (1) +1
Здравствуйте, 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

Другое дело, что в Хаскелле почти все функции и так уже каррированные, поэтому их вполне себе частично применяют за глаза и за уши.
Re[3]: Частичное применение
От: FR  
Дата: 23.12.07 09:18
Оценка:
Здравствуйте, deniok, Вы писали:

D>А карринг в Хаскелле (и вообще в ML) это преобразование функции от кортежа в ФВП одного аргумента


В Окамле еще страшнее, есть только функции от одного аргумента, а функции от многих аргументов чистый сахар например функция от двух аргументов это реально функция от первого аргумента выдающая как результат функцию (каррированую) к которой можно применить второй аргумент:
# let f x y = x + y;;
val f : int -> int -> int = <fun>
# f 1;;
- : int -> int = <fun>
Re[4]: Частичное применение
От: deniok Россия  
Дата: 23.12.07 10:17
Оценка:
Здравствуйте, FR, Вы писали:

FR>
FR># let f x y = x + y;;
FR>val f : int -> int -> int = <fun>
FR># f 1;;
FR>- : int -> int = <fun>
FR>


Ага, в Хаскелле ровно то же самое. Сессия ghci:
Prelude> let f x y = x + y
Prelude> :type f
f :: (Num a) => a -> a -> a
Prelude> :type f 1
f 1 :: (Num t) => t -> t
Re[3]: Частичное применение
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.12.07 04:22
Оценка:
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Частичное применение
От: FR  
Дата: 24.12.07 06:15
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Как видим, это немножечко более громоздко, чем прямая поддержка частичного применения в синтаксисе.


В питоне без подержки в синтаксисе, но с подержкой в виде стандартной библиотеки выглядит уже получше:

def TwoArguments(x , y): 
    return x + y
    
OneArgument = partial(TwoArguments, y = 123)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.