2011-03-21 3 views
7

대부분의 자습서/기사/서적은 기능적 프로그래밍을 제시 할 때 부작용에 대해 이야기합니다. 이 파이썬 코드를 가져 가라.기능 프로그래밍 : 부작용

def isPrime(n): 
    k = 2 
    while k < n: 
     if n % k == 0: 
      return False 
     k += 1 
    return True 

위의 함수에는 로컬 부작용이 있으며, 나는 그것을 이해하지 못한다. 변수 "k"가 바뀌고있는 것을 볼 수 있습니다. 나쁜 점이 무엇인지 이해하지 못합니다.

악의적 인 부작용에 대한 분명한 예를 들려 주시겠습니까? 기능적 프로그래밍으로 피할 수있는 방법은 있습니까?

+0

W.r.t. 부작용은 FP 대 프로 시저 프로그래밍 [IP 대 DP와 직교 함]을 참고하십시오 (http://stackoverflow.com/questions/602444/what-is-functional-declarative-and-imperative-programming/8357604#8357604).). –

답변

16

당신이 말하는 텍스트가 옳다. 지역 변수를 변경하는 것은 부작용으로 간주된다.

이것은 반드시 나쁜 것임을 말하지 않습니다. 함수형 프로그래밍이 아닙니다. 순수 함수형 프로그래밍 언어에서는 순환을 재귀 적으로 작성하여 변수를 변경할 필요가 없습니다.

(이와 같은 관찰 가능한 부작용이없는) 함수는 모든 언어에서 잘 작동하며 프로그래밍이 아닙니다.

편집 : 이제 "나쁜"부작용에 대한 의견을 보았습니다. 부작용이 나쁜 것은 아닙니다. 대부분의 주류 언어에서, 그것들없이 프로그래밍하는 것이 어렵고, 많은 프로그래머들이 부작용에 대해 생각한다고 생각합니다. 그러나 대규모 소프트웨어 프로젝트에서 부작용에 너무 많이 의존하게되면 인생을 꽤 비참하게 만들 수 있습니다. Here's a nice example involving singletons (the ultimate way to cause side effects)

부작용을 금지하는 언어에서는 프로그래머로서뿐만 아니라 컴파일러에게도 놀라움이 적습니다. 순수 함수 코드는 분석 및 병렬화가 더 쉽고 이론적으로는 컴파일러에서 최적화하기가 더 쉽습니다.

3

부작용 (특히 참조 투명성이 없음)은 result of your code depend on the order of execution of the statements입니다. 따라서 함수 호출 쌍을 호출하는 순서를 변경하면 프로그램의 연결이 끊긴 영역에서 동작이 변경 될 수 있습니다. 이것은 부작용의 상호 공유 때문에 실제로 연결이 끊어지지 않았기 때문입니다.

이렇게하면 프로그램의 분해가 어렵고 기존 코드를 새 코드로 작성하려는 시도가 불편하거나 코드의 일부 기능을 분리하여 분리하려는 시도가 어렵습니다. 다른 말로하면, 부작용은 Rigor Mortis 접착제와 같으며 모든 것을 흘려서 하나의 꿰 뚫을 수없는 모 놀리 식 스파게티가됩니다. 대부분의 다른 국수에 교란이 발생하지 않고 한 국수를 꺼내보십시오.

관련 문제