Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- spring-batch
- 플레이 프레임워크
- Logstash
- kafka interactive query
- reactive
- Kafka
- Elk
- gradle
- play framework
- kafkastream
- RabbitMQ
- kafka streams
- scala 2.10
- Elasticsearch
- springboot
- enablekafkastreams
- confluent
- kafkastreams
- coursera
- schema registry
- spring-cloud-stream
- spring-kafka
- statestore
- scala
- Slick
- 카프카
- 한빛미디어
- aws
- avo
- Spring
Archives
- Today
- Total
b
FP 비엄격성 본문
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
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