엄격성과 나태성 (1)

Jason Kim·2020년 5월 7일
0

fp in scala with TypeScript

목록 보기
10/17

이 시리즈는 "스칼라로 배우는 함수형 프로그래밍"을 TypeScript로 실습한 내용을 정리하고 있습니다.

엄격한 함수와 엄격하지 않은 함수

엄격성과 비엄격성은 함수의 한 속성이다.

  • 엄격한 함수
    • 자신의 인수들을 항상 평가
    • 대부분의 언어들은 엄격한 함수만 지원한다.
    • 인수가 값으로(by value) 전달된다.
  • 비엄격성(non-strictness) 함수
    • 비공식적으로는 나태성(laziness)라고도 부른다.
    • 하나 이상의 인수들을 평가하지 않을수도 있다.
    • 인수가 이름으로(by name) 전달된다.

단축 평가를 하는 && 와 ||, 조건에 따라 구문을 실행하는 if 등을 언어가 기본 지원하는 syntax로 생각할 수 있지만, 이들을 인수의 평가가 생략될 수도 있는 함수라고 생각해도 틀리지 않다.

일반적으로, 표현식의 평가되지 않은 형태를 성크(thunk)라고 부른다. 나중에 그 성크의 표현식을 평가해서 결과를 내도록 강제할 수 있다. 인수 목록이 비어있는 함수를 인자로 받는 예가 그러하다.
const fn: (thunk: () => number): number
thunk는 전달 시점에는 평가가 되지 않으며 함수 내부에서 값이 필요할때 평가를 한다. 경우에 따라서는 평가가 생략 될 수 있다.

스칼라는 이러한 구문에 대한 syntax sugar를 제공한다. thunk: () => number 대신 thunk: => number라고 지정할 수 있으며, 평가가 필요할때 thunk()라는 명시적 호출 구문 대신 thunk라고 표현할 수 있다.

또한 스칼라는 thunk로 전달된 비엄격 매개 변수에 대해서는 기본적으로 결과를 캐싱하지 않지만, lazy val x = thunk와 같이 lazy키워드를 사용하여 결과를 캐싱하도록 할 수도 있다.

0개의 댓글