사용자가 제공 한 예제 함수는 이미 순수하게 기능이다 : 바람직하게는, 기능적 패러다임의 일부가 될 것마다 엄격한 기술을 사용. 함수 순수성에 대해 이야기 할 때 우리가 실제로 말하는 것은 함수의 특성이 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
스택 오버 플로우에 오신 것을 환영합니다! 질문을하기 전에 [Help Center (도움말 센터)] (http://stackoverflow.com/help)를 읽어 주셔서 감사합니다. 훌륭한 첫 번째 질문이었습니다. 분명하고 간결하며, 필요한 세부 사항과 함께, 그리고 외적인 말없이. 당신의 질문을 5 번 upvote 할 수 있다면. 잘 했어! – rmunn