def f1 = "Hello, world" def f2 = { "Hello, world" } def f3() = "Hello, world" def f4()() = "Hello, world" def f5 = () => "Hello, world" def f6() = () => "Hello, world" def f7 = () => ( () => "Hello, world" ) def f8(c: =>String) = c def f9(c: =>String) = () => c f1을 정의하고 나면 다음에 f1을 만날 때 "Hello, world"로 대치된다. f2는 f1과 동일하게 동작한다. {}안에는 여러 식을 사용할 수 있으며 마지막 식이 전체의 값이 된다. f3는 f1과 동일하다. 괄호없이 단순히 f3로 적어도 "Hello, world"값이 대치되며 f3()로 적어도 된다. f4는 f1, f3와 동일하게 사용할 수 있으나 f4, f4(), f4()() 모두 "Hello, world" 문자열로 대치된다. REPL에서 식을 입력해 보면 f1, f2는 String이지만 f3는 ()String f4는 ()()String이다. 일종의 currying이 아닐까 싶은데 인자가 없기 때문에 그냥 함수 이름만 적어도 여러 단계를 한번에 확장해 버리는 것 같다. f5의 type은 () => String이다. 다시 말해 f5는 아무런 인자도 가지지 않고 문자열을 반환하는 함수로 대치된다. 단순히 f5로 적으면 type과 함수임을 보여주며 실행시키려면 f5()와 같이 명시적으로 실행시켜야 한다. f6의 type은 ()() => String이며 단순히 f6를 입력하면 f5와 동일하게 보이나 f6()를 입력하면 문자열이 바로 반환되지 않으며 f6()()와 같이 ...