대답은 수학 부작용은 없지만, 그 부작용이 모델 코드를 수학적으로 할 수 있다는 것이다. .
는 사실, 우리는 심지어 대신 (psuedocode) 함수의, 그래서 처음에 수학에 갈 필요없이 순수 코드 (에 불순한 코드를 설정하는이 트릭을 당겨 수 있습니다
f(x) = {
y := y + x
return y
}
합니다. . 부작용과 같은 일을 수행 할 수
f(x, state_before) = {
let old_y = lookup_y(state_before)
let state_after = update_y(state_before, old_y + x)
let new_y = lookup_y(state_after)
return (new_y, state_after)
}
이 ... 물론, 전체 프로그램이 명시 적으로 주변이 상태 값을 전달하기 위해 다시 작성되어야 할 것이다, 당신은 좋겠 : ... 우리가 쓸 수 적절하게 작성해야합니다. lookup_
및 update_
l 가변 변수이지만 이론적으로 간단한 과정입니다.
물론 아무도 이런 식으로 프로그램하고 싶지 않습니다. (하스켈은 언어의 일부분이되지 않으면 서 부작용을 시뮬레이트하기 위해 비슷한 일을하지만, 이것보다 인간 공학적으로 만들 많은 작업이 진행되고있다.)하지만 그렇게 할 수 있기 때문에 부작용은 잘 알려져있다. 정의 된 개념.
이것은 우리가 부작용과 언어에 대한 것을 증명할 수 있다는 것을 의미, 자신의 사양은 국가 통과 스타일로에 프로그램을 다시 작성하는 방법을 알고 충분한 정보를 제공 한한다.
안녕하세요, 감사합니다. 나는 더 많은 "외부 부작용"을 생각하고 있다고 말해야합니다. 좋아, 귀하의 예제와 나는 전역 변수에 대한 이유가 있습니다. 그러나 예를 들어 크래시가 발생하거나 단순히 실행되지 않을 수있는 데이터베이스에 연결하는 경우에도 동일한 작업을 수행 할 수 있습니다. 정확함을 증명할 때 세계의 상태, 오류 처리 등을 수행 할 수 있습니까? – niahoo
물론입니다. 물론 데이터베이스에서 연산을 모델링하기 위해서는 데이터베이스를 모델에 가져와야하므로'state_before'와'state_after'가 매우 커야합니다. (이것은 반드시 유일한 기법은 아니지만, 이것은 우리가 말하고있는 수학이므로 성능은 중요하지 않습니다. 따라서 이러한 엄청난 가치를 지니는 것이 좋습니다. –
ok :) 감사합니다. – niahoo