Как мы называем эту (новую?) Функцию высшего порядка? - PullRequest
10 голосов
/ 23 сентября 2010

Я пытаюсь назвать то, что я считаю новой идеей для функции более высокого порядка.Что важно, вот код на Python и Haskell для демонстрации концепции, которая будет объяснена позже.

Python:

>>> def pleat(f, l):
       return map(lambda t: f(*t), zip(l, l[1:]))
>>> pleat(operator.add, [0, 1, 2, 3])
[1, 3, 5]

Haskell:

Prelude> let pleatWith f xs = zipWith f xs (drop 1 xs)
Prelude> pleatWith (+) [0,1,2,3]
[1,3,5]

Как вы можете сделать вывод, последовательность повторяется, используя соседние элементы в качестве параметров для функции, которую вы передаете, проецируя результаты в новую последовательность.Итак, кто-нибудь видел функциональность, которую мы создали?Это вообще знакомо тем, кто в функциональном сообществе?Если нет, то как мы называем это?

---- Update ----

Плисс побед!

Prelude> let pleat xs = zip xs (drop 1 xs)
Prelude> pleat [1..4]
[(1,2),(2,3),(3,4)]

Prelude> let pleatWith f xs = zipWith f xs (drop 1 xs)
Prelude> pleatWith (+) [1..4]
[3,5,7]

Ответы [ 16 ]

2 голосов
/ 23 сентября 2010

zipWithTail или adjacentPairs.

1 голос
/ 29 сентября 2010

Хорошая идиома! Мне просто нужно было использовать это в Perl, чтобы определить время между последовательными событиями. Вот чем я закончил.

sub pinch(&@) {
  my ( $f, @list ) = @_;
  no strict "refs";

  use vars qw( $a $b );

  my $caller = caller;
  local( *{$caller . "::a"} ) = \my $a;
  local( *{$caller . "::b"} ) = \my $b;

  my @res;
  for ( my $i = 0; $i < @list - 1; ++$i ) {
    $a = $list[$i];
    $b = $list[$i + 1];
    push( @res, $f->() );
  }
  wantarray ? @res : \@res;
}

print join( ",", pinch { $b - $a } qw( 1 2 3 4 5 6 7 ) ), $/;
# ==> 1,1,1,1,1,1

Реализация, вероятно, могла бы быть более красивой, если бы я сделал ее зависимой от List :: Util , но ... ме!

1 голос
/ 23 сентября 2010

Я хотел бы назвать это контур , поскольку я использовал его для обработки "контура" в музыкальном программном обеспечении - в то время, когда я назвал его двухкарточным или что-то глупое.1004 * В обработке музыки есть также два конкретных названных «контура», один из которых - грубый контур - высота звука повышается или понижается.Другой - это утонченный контур, где контур либо вверх, вниз, либо скачок вверх, либо скачок вниз, хотя я не могу найти ссылку на то, насколько велика должна быть разница в полутонах, чтобы совершить скачок.

1 голос
/ 23 сентября 2010

Использование Mathematica

Plus @@@ Раздел [{0, 1, 2, 3}, 2, 1] илилюбая из этих более многословных альтернатив

Apply[Plus, Partition[{0, 1, 2, 3}, 2, 1], {1}]
Map[Apply[Plus, #] &, Partition[{0, 1, 2, 3}, 2, 1]]

Я использовал эту функцию более высокого порядка во многих языках, но мне она больше всего понравилась в Mathematica;он кажется лаконичным и гибким, разбит на разделы и применяется с параметром levelpec.

1 голос
/ 23 сентября 2010

Так как, кажется, для этого нет названия, я предлагаю «слияние» или простое «слияние», потому что вы объединяете смежные значения вместе.

Итак, объединение уже выполнено, поэтому я предлагаю «объединить» (или «объединить», но это может быть слишком близко к «объединению»)

Например:

meld :: (a -> a -> b) -> [a] -> [b]
meld _ [] = []
meld f xs = zipWith f (init xs) (tail xs)

Который может использоваться как:

> meld (+) [1..10]
[3,5,7,9,11,13,15,17,19]
> meld compare "hello world"
[GT,LT,EQ,LT,GT,LT,GT,LT,GT,GT]

Там, где второй пример не имеет реального смысла, но делает классный пример.

0 голосов
/ 23 сентября 2010

BinaryOperate или BinaryMerge

...