수학의 함수와 프로그래밍의 함수는 어떤 차이가 있습니까?
수학의 함수와 프로그래밍의 함수는 어떤 차이가 있습니까?
기능적 프로그래밍에서는 Reference Transparency(기준 투명도)를 사용할 수 있는데, 이는 프로그램을 변경하지 않고 함수를 해당 값으로 바꿀 수 있음을 의미합니다.이것은 수학에서도 사실이지만 임페리얼 언어에서는 항상 사실이 아닙니다.
수학 함수는 한 집합(A)에서 다른 집합(B)으로 요소를 매핑하여 첫 집합의 각 요소를 다른 집합 중 하나와만 매핑하는 관계로 정의됩니다.C(다른 프로그래밍 언어에서와 마찬가지로)에서도 이는 사실이며 입력 세트와 출력 세트(거의 항상 하나만 있음)가 있습니다.
은라고 ,f(x)
수학에서, 당신은 항상 같은 답을 얻을 것입니다, 그러나 만약 당신이 전화를 한다면.f'(x)
C에서는 답이 같지 않을 수 있습니다. 동일한 인수가 항상 동일한 출력을 반환하는 것은 아닙니다.비기능 언어의 함수는 사용자가 주는 인수에만 의존하는 것이 아니라 프로그램의 다른 것들(범위, 전역, 내장, 객체 지향을 사용하는 경우 진술)에 의존할 수 있습니다.
수학과 C 함수의 또 다른 차이점은 수학에서 비어 있지 않은 집합에서 비어 있는 집합으로 가는 함수를 만들 수 없다는 것입니다(C에서 이것은: 함수로 항상 무언가를 반환할 필요는 없습니다).또한 모든 함수가 계산 가능한 것은 아닙니다. (수학에도 이와 유사한 것이 있는지 모르겠습니다.)무한 집합에 대한 함수는 없지만 수학에서는 무한 집합에 대한 함수(f: N -> N과 같이)와 셀 수 없는 집합에 대한 함수(f: R -> R과 같이)를 정의할 수 있습니다(C에서는 부동 소수점 수가 있지만 실수의 축소된 집합만 나타냅니다.(이것은 유한합니다).
요약:
C에서 참조 투명도가 항상 있는 것은 아닙니다.함수가 동일한 입력 매개변수에 대해 항상 동일한 출력을 제공하는 것은 아닙니다.무한 입력 집합에 대해 정의되는 수학 함수를 가질 수 있지만 C 함수에서는 입력이 유한합니다.C 함수에서는 아무것도 반환하지 않는 함수를 가질 수 있지만, 수학에서는 그런 함수를 가질 수 없습니다(입력 집합이 비어 있지 않은 함수가 있으면 각 요소를 다른 집합 중 하나와 매핑해야 합니다).
영역(함수의 영역을 의미하는 것이 아니라 학습의 영역을 의미하는 것)과 언어에 따라 다릅니다.
수학에서 함수는 주어진 입력 값(수직선 검정, 기억)에 대해 하나의 출력에만 매핑되는 입력을 가지고 있습니다.프로그래밍에서 이는 "입력"과 "함수 논리" 사이의 선을 어디에 그느냐에 따라 엄밀하게 동일하지 않을 수 있습니다.
예를 들어, 우리가 대기 조건을 읽어들이는 함수 rand()를 가지고 있다고 가정해 보겠습니다.또한 호출 함수가 정수 매개 변수 하나를 일종의 승수로 사용한다고 가정해 보겠습니다.다음 기능이 있습니까?
int giveRandAtmosWithMul(int mult)
{
return mult * rand();
}
수학적인 의미에서, 만약 당신이 mult를 문제에 대한 유일한 입력으로 간주한다면, 그것은 아마도 함수가 아닐 것이지만, 분명히 rand()는 또한 입력을 제공하고 있습니다 (비록 rand()가 기계 코드에서 항상 같은 진입점을 갖지만).
보시다시피, 모든 사람이 동의하는 표준 프로토콜 없이는 차이점을 객관적으로 정의할 수 없습니다.
제 생각에 가장 중요한 차이점은 수학(그리고 기능적 프로그래밍)의 기능은 상태를 바꿀 수 없는 반면, (필수적인) 프로그래밍 기능은 상태를 바꿀 수 있다는 것입니다.
다른 대답들은 맞습니다 - 이것들은 두 가지 다른 것들입니다.제가 보여드리겠습니다, 반대로, 그들은 관련이 있습니다.->
, 에 .=>
.
예외를 지원하는 언어가 있다고 가정합니다.다 해 볼 수 .A -> B
A => B + E
+ 는 서 "B + E"합니다의 합니다.B
어떤 의, E
의 언어에는 두가 있습니다 사용자의 언어에는 함수에서 반환할 두 개의 키워드가 있습니다. "반환"과 "던지기".
두 할 수 .f: A -> B
그리고.g: B -> C
g(f(x))
이것은 A를 찍고 C를 돌려주는 기능입니다.자바나 파이썬 같은 여러 언어로 가능합니다. 만약라면,f(x)
를 던집니다.다.g
됩니다에 해 보십시오. 생각해 보십시오.g(1/0)
하므로 의 가 없습니다.f
예외입니다. 을 묘사하는 f: A => B+E
그리고.g: B => C+E
, 함수가 들어가는 언어 "lifts"B+E => C+E
.g
이제는 예외를 적용할 수도 있지만 단순히 전파만 가능합니다.
즉, 정의합니다.g': B+E => C+E
타고
/ g(x) if x ∈ B
g'(x)= |
\ x if x ∈ E
2가지 기능을 가지는 것f: A => B+E
그리고.g': B+E => C+E
수학적인 의미로 안전하게 작곡할 수 있습니다.그리고 이게 뭐지?g(f(x))
프로그래밍에서는 가능하지만, 그것은 들어올려야 합니다.g
안으로g'
첫번째.
비결정론에 대해 생각해 보세요.기능이 있는 경우A -> B
그것은 비결정적이고, 그러면 이것이 함수라고 수학적으로 묘사할 수 있습니다.A => Set(B)
어디에Set(B)
는 가능한 결과의 집합입니다.예를 들어, 만약f(1)
수학적으로 1, 2, 3을 줄 수도 있습니다.f(1) = {1,2,3}
비록 프로그래밍을 하면서 요청을 받았을 때f(1)
이 숫자들 중 하나만 얻을 수 있습니다.이제 비결정적 함수를 구성할 수 있습니다.A->B
그리고.B->C
서면으로g(f(x))
. 결과는 다음과 같습니다.C
, 하지만 결정적이지 않을 겁니다.수학적으로 함수를 구성합니다.A => Set(B)
그리고.B => Set(C)
당신에게 주는A => Set(C)
.비록 ~일지라도g
하나의 값만 사용합니다.B
, 당신은 그것을 비결정적인 값으로 들어올려야 합니다.g': Set(B) => Set(C)
.예를들면,g'({1,2})
집합의 합집합g(1)
그리고.g(2)
.그렇게g(f(x))
당신이 뛴다는 뜻.f
, 가능한 모든 결과를 설정하고 실행합니다.g
그것들 각각에.두 개의 무결정성 층이 있지만, 그것들은 하나로 "평탄화"됩니다.
글로벌 스테이트(global state)도 마찬가지입니다.함수와 결과의 인수로 모든 전역 변수를 만들면 전역 변수가 없고 모든 함수가 모든 전역 상태를 취하고 언어가 구성할 때 상태를 넘겨줘야 한다고 생각할 수 있습니다.A함수A -> B
읽기와 쓰기 상태.S
는 함수입니다.(A,S) => (B,S)
, 다음과 같이 적을 수도 있습니다.A => (S => (B,S))
. 이것을 정식으로 쓰는 것은 더 복잡하지만, 같은 패턴입니다.
입출력도 마찬가지입니다. 다른 SO 답변에서 설명했습니다.
"효과적인" 기능을 구성할 수 있는 "마법"은 다음과 같습니다.
- 타입을 효과적으로 만드는 방법.예를 들어, 돌림
B
안으로B+E
아니면Set(B)
. 유형의 효과적인 버전을 표시합니다.X
~하듯이F(X)
. - 기능을 들어올리는 방법:
B -> F(C)
안으로F(B) -> F(C)
. 기능을 구성할 수 있습니다.A -> F(B)
그리고.B -> F(C)
. - 키워드를
return
보통 값을 돌려야 합니다.A
안으로A+E
, 또는 싱글톤Set(A)
. 그러니까 유형이.X -> F(X)
.
그 세 개로 구성된 구조를 모나드라고 합니다.모나드는 그러한 부작용들을 설명할 수 있게 해줍니다. 모나드는 또한 몇가지 특정한 기능들을 가지고 있을지도 모릅니다, 예를 들어 모나드가 가지고 있는 예외적인 것입니다.throw
는 , ,fork
, 주 모나드는 가지고 있습니다.get/put
, IO read/write
타
도덕성은 다음과 같습니다.랜덤화, 예외, 비결정성, 입출력과 같은 특수 효과를 함수의 결과로 간주한다면, 모든 함수는 참조적으로 투명하고 필수 프로그래밍의 함수는 수학적 함수이지만 특수 효과도 설명하는 매우 이상한 결과 유형입니다.이것은 하스켈과 같은 순기능 언어가 취하는 접근법입니다.
수학에서 함수는 예외를 두지 않습니다.:)
컴퓨터 과학에서 함수는 입력을 받아 무언가를 하고 출력을 반환하는 코드 덩어리입니다. 하지만 그 사이에서 많은 것들을 할 수 있습니다.웹 페이지를 가져올 수도 있고, 이메일을 보낼 수도 있고, 비디오를 재생할 수도 있습니다.
수학에서 함수는 매우 구체적이고 다른 것은 없습니다.함수는 일반적으로 입력을 받고 출력을 뱉어내는 "기계"로 설명됩니다.컴퓨터 과학 기능은 입력을 받아들이고 출력을 뱉어내기는 하지만 수학에 필요한 정확한 "동일한 입력은 항상 동일한 출력을 낸다"는 것과는 관련이 없습니다(예: boole IsMyApplicationRunningInFullScreen()). 입력이 전혀 없는 다양한 값을 반환합니다.
수학적 함수는 본질적으로 선언적입니다. 즉, 그들은 항상 "무엇이" 설명을 가지고 있는 반면 컴퓨터 과학에서의 함수는 필수적입니다. 즉, 그들은 "어떻게" 설명을 가지고 있습니다.
참조:컴퓨터 프로그램의 구조 및 해석
언급URL : https://stackoverflow.com/questions/3605383/what-is-the-difference-between-functions-in-math-and-functions-in-programming
'programing' 카테고리의 다른 글
jQuery AJAX 'multipart/form-data' 데이터를 보내지 않습니까? (0) | 2023.09.25 |
---|---|
powershell 콘솔에서 로그 파일을 보려면 어떻게 해야 합니까? (즉, 'less'에 해당하는 powershell) (0) | 2023.09.25 |
VC++ 명령줄을 사용하여 .dll 및 .lib 파일 생성 (0) | 2023.09.25 |
ANSIC에서 설명서 코멘트를 작성하는 방법은? (0) | 2023.09.25 |
WordPress TemplatePath (0) | 2023.09.25 |