Infinity는 덧셈에 대해 흡수적이다. 즉, Infinity에 다른 Double 인스턴스를 더해도 항상 Infinity가 나온다. 하지만 나눗셈의 경우 항상 흡수적이지는 않다. Infinity를 0.0으로 나누면 NaN(숫자가 아님을 뜻하는 Not a Number의 줄임말)이 나온다. 이름과 달리 NaN도 Double의 인스턴스다. 다음 코드를 살펴보자.
var percent1 = 5 fun applyTax1(a: Int): Int = a / 100 * (100 + percent1)
applyTax1 메서드는 결과가 percent1 값에 따라 달라지기 때문에 순수 함수가 아닌 것으로 보인다. percent1은 공개 필드이며 두 applyTax1 함수 호출 중간에 값이 바뀔 수 있다. 따라서 같은 인자를 가지고 두 번 함수를 호출해도 결과가 달라질 수 있다. percent1이 applyTax1에 대한 암시적인 파라미터라고 생각할 수 있다. percent1을 함수 안에서 단 한 번만 사용한다면 이를 암시적 파라미터로 생각해도 문제가 없지만, 함수 안에서 여러 번 읽어서 사용한다면 두 읽기 연산 사이에 percent1의 값이 바뀔 수 있다. 따라서 percent1 값을 여러 번 사용해야 한다면 반드시 그 값을 지역 변수에 보관해야 한다. 따라서 applyTax1은 (a, percent1)이라는 쌍에 대해서는 순수 함수이지만 a에 대해서는 순수 함수가 아니다.
이 예제에서는 FunFunctions 타입의 객체 자체를 암시적인 인자로 간주할 수 있다. 이 객체의 모든 프로퍼티를 함수 안에서 사용할 수 있기 때문이다. 이 개념은 중요하다. 모든 인스턴스 메서드/함수는 그 메서드/함수를 둘러싸고 있는 클래스 타입의 파라미터를 추가함으로써 인스턴스에 속하지 않는 메서드/함수로 변경할 수 있다. applyTax1 함수를 이런 식으로 FunFunctions 밖에서 다시 작성하면 다음과 같다(심지어 이 함수를 FunFunctions 안에 정의할 수도 있다).
fun applyTax1(ff: FunFunctions, a: Int): Int = a / 100 * (100 + ff.percent1)