2016-11-28 1 views
14

저는 경험이 많은 OOP 프로그래머 (주로 C++)입니다. 이제는 함수 프로그래밍을 시작하려고합니다. 내 이해에서 순전히 기능적인 패러다임에서, 함수는 조건문을 가져서는 안되며, currying을 사용하여 가능한 한 많이 분해해야한다. 누군가 나에게 다음 예제의 "순수한"기능 버전을 제공 할 수 있습니까?Purely Functional Programming

let rec greatestCommonFactor a b = 
    if a = 0 then b 
    elif a < b then greatestCommonFactor a (b - a) 
    else greatestCommonFactor (a - b) b 
+2

스택 오버 플로우에 오신 것을 환영합니다! 질문을하기 전에 [Help Center (도움말 센터)] (http://stackoverflow.com/help)를 읽어 주셔서 감사합니다. 훌륭한 첫 번째 질문이었습니다. 분명하고 간결하며, 필요한 세부 사항과 함께, 그리고 외적인 말없이. 당신의 질문을 5 번 upvote 할 수 있다면. 잘 했어! – rmunn

답변

16

사용자가 제공 한 예제 함수는 이미 순수하게 기능이다 : 바람직하게는, 기능적 패러다임의 일부가 될 것마다 엄격한 기술을 사용. 함수 순수성에 대해 이야기 할 때 우리가 실제로 말하는 것은 함수의 특성이 referentially transparent 인 것입니다.

표현식은 프로그램의 효과를 변경하지 않고도 값으로 대체 될 수 있다면 명확하게 투명합니다. 간단한 예를 제공하기 위해, 기능을 상상 :

let add2 x = x + 2 

지금, 어느 곳에서나 값 add2 2 우리의 프로그램에 나타나는지, 우리는 프로그램의 동작을 변경하지 않고 값 4을 대체 할 수 있습니다. 우리는 콘솔에 출력하는 기능에 몇 가지 추가 동작을 추가하는 것이 지금은 상상

:

let add2Print x = 
    printfn "%d" x 
    x + 2 

함수의 결과 비록 우리가 더 이상 값으로 값 대체를 수행 할 수없는, 이전과 동일 4 우리의 기능은 콘솔에 인쇄하는 부작용이 있기 때문에 프로그램의 동작을 변경하지 않습니다.

이 함수는 더 이상 참조가 투명하지 않으므로 순수한 함수가 아닙니다. 사용자가 제공 한이 기능을 보면


let rec greatestCommonFactor a b = 
    if a = 0 then b 
    elif a < b then greatestCommonFactor a (b - a) 
    else greatestCommonFactor (a - b) b 

은, 어떤 부작용은 그것의 실행에 관여하지 않습니다. 주어진 입력 값에 대해 항상 동일한 출력 값을 얻을 수 있습니다. 따라서 이것은 이미 순수한 함수입니다.

함수 프로그래밍에서 조건문을 포함하는 함수에는 아무런 문제가 없습니다. 그러나 종종 우리는 if/elif/else 표현식보다는 패턴 매칭을 사용하지만 설명 된 예에서 이것은 순전히 문체입니다. 패턴 일치를 사용하는 함수의 다른 표현식은 다음과 같습니다.

let rec greatestCommonFactor a b = 
    match a with 
    |0 -> b 
    |a' when a' < b -> greatestCommonFactor a' (b - a') 
    |a' -> greatestCommonFactor (a' - b) b 
+2

그래서 조건은 중요하지 않습니까? 필자는 기능 패러다임에서 조건부를 제거하는 것이 바람직하다고 생각했습니다. 그 대신에 람다를 사용하는 것. – Zach

+4

@Zach 일부 기능 언어는 간결한 스타일로 경향이 있지만 조건부는 여전히 존재합니다. Haskell조차도'if' 키워드를 가지고 있습니다. F #에서와 마찬가지로,'if'와'then'보다는 더 많이 패턴 매칭을 사용하는 경향이 있습니다. –

+5

@Zach 아니요, 조건부는 절대적으로 중요하지 않습니다. 함수형 프로그래밍의 조건문은'if/elif/else' 표현식을 통하는 것보다는 패턴 매칭을 통해 처리되는 경우가 많지만 여기서 제시 한 경우 순수 문법입니다. – TheInnerLight