В чем разница между процедурным программированием и функциональным программированием?

В основном эти два стиля functional-programming похожи на Инь и Ян. Один programming-paradigms организован, а другой хаотичен. Бывают glossary ситуации, когда функциональное functional-programming программирование является functional очевидным выбором, а в других glossary случаях лучше выбрать процедурное functional программирование. Вот почему paradigm есть по крайней мере два procedural-programming языка, которые недавно выпустили paradigm новую версию, охватывающую glossary оба стиля программирования. ( Perl 6 и D 2 )

#Процедурный:#

  • Выход подпрограммы не всегда имеет прямую корреляцию с входом.
  • Все делается в определенном порядке.
  • Выполнение процедуры может иметь побочные эффекты.
  • Делает акцент на реализации решений линейным образом.

##Perl 6 В чем разница между процедурным программированием и функциональным программированием?_programming-paradigms##

sub factorial ( UInt:D $n is copy ) returns UInt {

  # modify "outside" state
  state $call-count++;
  # in this case it is rather pointless as
  # it can't even be accessed from outside

  my $result = 1;

  loop ( ; $n > 0 ; $n-- ){

    $result *= $n;

  }

  return $result;
}

##D 2##

int factorial( int n ){

  int result = 1;

  for( ; n > 0 ; n-- ){
    result *= n;
  }

  return result;
}

#Функциональность:#

  • Часто рекурсивный.
  • Всегда возвращает один и тот же результат для заданного ввода.
  • Порядок оценки обычно не определен.
  • Должен быть без гражданства. т.е. никакая операция не может иметь побочных эффектов.
  • Подходит для параллельного выполнения
  • Делает акцент на подходе «разделяй и властвуй».
  • Может иметь функцию Lazy Evaluation.

##Haskell## (скопировано procedural-programming с Wikipedia );

fac :: Integer -> Integer

fac 0 = 1
fac n | n > 0 = n * fac (n-1)

или одной строкой:

fac n = if n > 0 then n * fac (n-1) else 1

##Perl 6 В чем разница между процедурным программированием и функциональным программированием?_programming-paradigms##

proto sub factorial ( UInt:D $n ) returns UInt {*}

multi sub factorial (  0 ) { 1 }
multi sub factorial ( $n ) { $n * samewith $n-1 } # { $n * factorial $n-1 }

##D 2##

pure int factorial( invariant int n ){
  if( n <= 1 ){
    return 1;
  }else{
    return n * factorial( n-1 );
  }
}

#Примечание: #

Факториал programming-paradigms на самом деле является распространенным procedural-programming примером, показывающим, как glossary легко создавать новые операторы functional в Perl 6 так же, как вы создаете procedural-programming подпрограмму. Эта функция paradigms настолько укоренилась в Perl paradigm 6, что большинство операторов glossary в реализации Rakudo определены programming-paradigms таким образом. Это также functional позволяет вам добавлять своих functional собственных нескольких кандидатов paradigms к существующим операторам.

sub postfix:< ! > ( UInt:D $n --> UInt )
  is tighter(&infix:<*>)
  { [*] 2 .. $n }

say 5!; # 120␤

В paradigms этом примере также показано procedural-programming создание диапазона (2..$n) и метаоператор glossary сокращения списка ([ OPERATOR ] LIST) в сочетании programming-paradigms с числовым инфиксным оператором programming-paradigms умножения. (*)
Это также показывает, что procedural-programming вы можете поставить --> UInt в подписи functional вместо returns UInt после нее.

(Вы можете functional-programming начать диапазон с 2, поскольку procedural-programming «оператор» умножения вернет paradigm 1 при вызове без каких-либо functional-programming аргументов)

functional-programming

glossary

paradigms

procedural-programming

2022-11-02T20:05:11+00:00
Вопросы с похожей тематикой, как у вопроса:

В чем разница между процедурным программированием и функциональным программированием?