이렇게 참조 투명한 식을 그 결괏값으로 치환해 프로그램을 계산하는 모델을 치환 모델(substitution model)이라고 한다. 이런 치환 모델을 함수에 적용하면 함수 호출을 그 반환 값으로 치환할 수 있다. 다음 코드를 살펴보자.
fun main(args: Array<String>) { val x = add(mult(2, 3), mult(4, 5)) println(x) } fun add(a: Int, b: Int): Int { log(String.format("Returning ${a + b} as the result of $a + $b")) return a + b } fun mult(a: Int, b: Int) = a * b fun log(m: String) { println(m) }
여기서 mult(2, 3)과 mult(4, 5)를 각각의 반환 값으로 치환해도 프로그램 전체의 의미는 바뀌지 않는다. 이를 다음과 같이 볼 수 있다.
val x = add(6, 20)
반면에 add 함수 호출을 그 반환 값으로 바꾸면 더 이상 log를 호출하지 않아서 아무런 로그도 남지 않기 때문에 프로그램의 의미가 바뀐다. 이런 의미 차이가 중요할 수도 있고 중요하지 않을 수도 있지만, 어쨌든 프로그램의 결과는 달라진다.