language/scala2015.05.18 22:58

p83~

1. 엄격성과 비엄격성


- 엄격성  (strictness)

- 비엄검성 (non-strictness; laziness)

 : 함수의 한 속성으로, 함수가 엄격하지 않다는 것은 하나 이상의 인수들을 '평가하지 않을 수도'있다는 뜻이다.


대부분의 프로그래밍 언어에서는 엄격한 함수가 기본이다. 스칼라로 기본 정의는 엄격한 함수이다. 

하지만 그 개념 자체는 익숙하다. 부울 함수의 &&, ||의 단축 평가는 '엄격하지 않다' 첫 조건이 true이어야만 두 번째 조건을 검사한다.

스칼라의 if 역시 '비엄격성 함수'로 생각할 수 있다(단 매개변수 자체에 대해서는 엄격하다).


여튼  스칼라는  인수들 중 일부가 평가되지 않아도 호출이 성립하는 비엄격함수를 작성 할 수 있다.



2. 스칼라의 비엄격성 함수 작성

def if2[A](cond:Boolean, onTrue:() =>A, onFalse:() =>A) : A = if (cond) onTrue() else onFalse()
처럼 ()=> 즉, Function0[A] 형식으로 인수를 표기해준다.
if2(true, ()=>println("A"), ())=>println("B") )
를 실행하면 결과는 'A'
이 활용방법이 흔하기 때문에 스칼라에서는 좀 더 깔끔(축약)한 구문을 제공한다.
def if2[A](cond:Boolean, onTrue: =>A, onFalse: => A) : A = if (cond) onTrue else onFalse


3. 비엄격성 함수에서 평가 평가되지 않은 채로 함수에 전달되는 인수는 '함수의 본문에서 참조된 장소마다 한번씩 평가된다'

def mayBeTwice(b:Boolean, i: => Int) = if (b) i+i else 0 val x = mayBeTwice(true, {println("hi"); 1+41} )

결과는

hi
hi
x:Int = 84


mayBeTwice함수에서 i는 2번 참조되고, 그렇기 때문에 hi가 2번 출력된다.  만약 캐싱을 적용하고 싶다면 lazy를 이용한다.

def m(b:Boolean, i: => Int) = {
	lazy val j=i; if(b) j+j else 0
}
"스칼라의 비엄격 함수의 인수는 by value가 아닌 by name이다"


'language > scala' 카테고리의 다른 글

SCALA UPPER/LOWER TYPE BOUND & VIEW BOUND  (0) 2017.06.28
Superseded by Akka HTTP  (0) 2017.05.01
FP 비엄격성  (1) 2015.05.18
scala package object  (0) 2014.11.05
scala의 lazy 비용  (0) 2014.10.21
spray는 멋지군..  (0) 2014.10.20
Posted by dev.bistro