FP 비엄격성

language/scala 2015.05.18 22:58 posted by dev.bistro

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

한빛미디어 / 데이터 과학 입문

분류없음 2014.12.27 15:47 posted by dev.bistro




링크 : http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-135-2


이 책에 대해서 몇번 들었지만, 생소한 분야를 원서로 읽을 용기는 없었다. 이번에 한빛에서 번역판이 나오게 되어서 읽었고, 슥슥 넘겨본 정도이지만, 이에 대한 이야기를 해볼까 한다.

책 서두에도 나오지만 '빅 데이터' 와 '데이터 분석'은 유행처럼 번졌고 아직도 대세다.  정확히 무엇을 뜻하는지 나 같은 평민 개발자는 쉽게 이해할 수 없었다. 

포털회사에서 검색에 근무하는 나는 이 정도의 데이터를 처리하고 있으니까 빅데이터인가? 검색로그를 보면서 의미있는 결과를 뽑기위해 삽질하는 나는 데이터 분석을 하고 있는가? 고민하면서 여기 저기 기웃거리며... 그게 여의치 않을때는 책으로 배울려고 했다 ( T_T http://bistros.tistory.com/88 베이지언 통계 내용은 이 책에서 스팸 필터를 처리하는 방법으로 다시 접하였다)

책의 시작은 이러한 고민을 함께 함으로써 시작된다. 그리고 기본적인 알고리즘 선형회귀나 k근접과 같은 아주 기본적인 개념부터 설명한다. (아... 심플한건 책 쓴사람들 입장이다 난 이때부터 어려웠다 -ㅇ-)


그리고 그나마 익숙한 베이지언부터  이야기를 시작한다. 하나의 사례에 대해서 20-30page의 적당한 양으로 분석 / 방법을 제시해 주고 마지막에는 R code로 실제 어떻게 프로그래밍으로 적용시켜야 하는지도 보여준다. (통계학자가 아닌 프로그래머 입장에서 매우 감사하다)


약간의 프로그래밍 지식(R) 과 대충 미적분을 아는 수학 실력이면 이 책을 훑어 볼 수 있다. (물론 다 이해한다는건 아니다). 

이 책이 나에게 실적적인 도움이 되었다고는 말 못한다. 하지만 나처럼, 왜? 뭐? 에 대한 약간의 조언과, 앞으로의 길라잡이 정도는 제시해 줄수 있을듯 하다. 

(개인적으로) 책 내용은 상당히 난해했고, 딱딱했다... 하지만, 꼭 한번 읽어보라 추천해주고 싶다. 

신고



링크 : http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486739


Java8이 나온지도 반년이 지났다.

Java7에 비해서 그 변화도 크고 도입해야 할 이유도 확실하기 때문에 많은 관심을 가지고 있다.


현업에서는 아직 8을 이용하지는 않고 있지만, 개인 프로젝트나, 알고리즘을 해결 해야 하는 이슈가 있다면 java-8로 진행한다.


Java에서 중요한 전환점이 될 8 버전에 대해서  국내 서적은 그렇게 많지 않다. 2권 정도...


그 중 한권은 자바8의 핵심임 람다에 대해서만 설명한 책이었고, 

같은 200페이지를 어떤식으로 풀어 나가나 싶어서 이 책을 보게 되었다.

(책의 목차가 매우 다르다 @.@)


1. 번역

번역서이니 만큼 번역에 대해서 애기해볼까 한다.

55페이지부터 계속 등장하는 '원시 특수화'나 61페이지의 '공개된 리소스' 처럼 한글로 된 애매모호한 단어들이 눈에 거슬렸다. 

'원시 타입-primitive type' 처럼 일관성인게 원단어를 첨부해주면 좋았지 않을까 한다.

4.4장에서는 좀 갸웃거렸지만 "8장. 디자인 구조와 원칙"처럼 개념적인 단원에서도 어렵지 않게 읽어 내려 갈 수 있었다. 

뒤로 갈수록 좀 더 이해하기에 편안한 느낌 들었다.  (솔직히 개인적으로 번역에 대해 민감한 편은 아니기도 하다)



2. 다른 한빛의 e북보다 페이지도 많은 편이고 코드량도 많지 않기 때문에  많은 내용이 들어 있다. 단순한 람다의 사용법만을 설명하지 않고

병렬성 이슈와 테스트, 패턴까지 한 번에 언급한점은 마음에 들었다. (보는이에 따라서 찔끔찔끔 이라고 싫어하는 분도 있겠네...)

특히 자바와 뗄수 없는 패턴의 언급은 매우 적절해 보였다. 

람다식을 배운후 어떻게 적용할까, 어떤식으로 적용하는가에 대해 의문점을 가진다면 이 부분의 예제로 충분히 이해를 하리라 생각되어 진다.

(물론 더 좋은것은 github에서 l=java와 함께 검색하는 것이다.)



마지막으로..

javascript나, scala와 같은 기존 람다 개념에 익숙한 언어 개발자라면 높은 장벽은 아니다. 

하지만, 오래된 자바 개발자나 람다 자체가 생소하다면  문법적 학습뿐 아니라 또 다른 학습을 요한다. 그리고 생각의 전환도 좀 필요하고...

쉬운 문법의 설명으로 부터,  중요한 주제들을 한번씩 훑어 있는 이책은

자바8을 처음 접하려는 사람이나, 나같이 이미 사용하고 있는 사람들에게도 또 한번 생각해줄만한 계기가 될 수 있겠다.

(어렵다면 다음 책을 한번 읽고 다시 읽어보면 좋을듯 : http://www.hanbit.co.kr/ebook/look.html?isbn=9788979149678 )


신고


티스토리 툴바