기능적 프로그래밍에서 차이를 만드는 것은 무엇입니까?
함수형 프로그래밍은 원칙적으로 선언적 입니다. 계산 방법 대신 결과가 무엇인지 말합니다 .
스 니펫의 실제 기능 구현을 살펴 보겠습니다. Haskell에서는 다음과 같습니다.
predsum pred numbers = sum (filter pred numbers)
그것은 분명 어떤 결과가? 따라서 술어를 충족시키는 숫자의 합계입니다. 어떻게 계산 되나요? 상관 없어요, 컴파일러에게 물어보세요.
당신은 아마도 사용하여 말할 수 sum
및 filter
트릭이며이 포함되지 않습니다. 그런 다음이 도우미없이 구현하십시오 (가장 좋은 방법은 먼저 구현하는 것입니다).
사용하지 않는 "Functional Programming 101"솔루션 sum
은 다음과 같습니다.
sum pred list =
case list of
[] -> 0
h:t -> if pred h then h + sum pred t
else sum pred t
단일 함수 호출 측면에서 결과가 무엇인지 여전히 분명 합니다. 이 중 하나입니다 0
, 또는 recursive call + h or 0
에 따라 pred h
. 최종 결과가 즉각적으로 명확하지 않더라도 여전히 매우 단호합니다 (조금 연습하면 실제로 for
루프 처럼 읽습니다 ).
귀하의 버전과 비교하십시오 :
public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){
int result = 0;
foreach(var item in numbers)
if (predicate(item)) result += item;
return result;
}
결과는 어떻습니까? 오, 나는 본다 : 단 하나의 return
진술, 놀랄 것도 없다 : return result
.
그러나 무엇 result
입니까? int result = 0
? 옳지 않은 것 같습니다. 당신은 나중에 그것으로 무언가를합니다 0
. 좋아, 당신 item
은 그것에 s를 추가 합니다. 등등.
물론 대부분의 프로그래머에게는 이와 같은 간단한 기능에서 어떤 일이 발생하는지는 분명하지만 추가 설명을 추가 return
하면 갑자기 추적하기가 더 어려워집니다. 모든 코드에 관한 방법 , 그리고 무엇을 알아낼 독자 방치 - 이것은 분명히 매우 필수적 스타일입니다 .
변수와 루프가 잘못 되었습니까?
아니.
그들에 의해 훨씬 쉽게 설명되는 많은 것들이 있으며, 가변 상태가 빠르기를 요구하는 많은 알고리즘이 있습니다. 그러나 변수는 설명, 본질적으로 필수적이다 방법 대신에 무엇을 , 그 값이 몇 줄 이상 또는 몇 개의 루프 반복 한 후에 어떻게 될 것인가의 작은 예측을 제공합니다. 루프는 일반적으로 상태를 이해해야하므로 본질적으로 필수적입니다.
변수와 루프는 단순히 기능적 프로그래밍이 아닙니다.
요약
현재의 funcitonal programming은 패러다임보다 스타일과 유용한 사고 방식에 가깝습니다. 순수한 기능에 대한 강한 선호가이 사고 방식에 있지만 실제로는 그저 작은 부분 일뿐입니다.
가장 널리 사용되는 언어를 사용하면 일부 기능적 구성을 사용할 수 있습니다. 예를 들어 Python에서는 다음 중에서 선택할 수 있습니다.
result = 0
for num in numbers:
if pred(result):
result += num
return result
또는
return sum(filter(pred, numbers))
또는
return sum(n for n in numbers if pred(n))
이 함수식은 이런 종류의 문제에 잘 맞고 코드를 짧게 만듭니다 ( 짧을수록 좋습니다 ). 명령 코드를 무의식적으로 대체해서는 안되지만, 적합 할 때는 거의 항상 더 나은 선택입니다.
item
루프에서 변수가 변경 되면 부작용 이 없습니다. 부작용 이 있습니다 .