b

FP 비엄격성 본문

language/scala

FP 비엄격성

dev.bistro 2015. 5. 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
scala package object  (0) 2014.11.05
scala의 lazy 비용  (0) 2014.10.21
spray는 멋지군..  (0) 2014.10.20
Comments