Scala. foldLeft를 foldRight로 구현하기. IT

FPinScala 책의 foldl을 foldr로 구현하는 문제로 

함수형 프로그래밍 습득의 고난을 토로하는 글을 읽었다. 

전에 책을 읽으면서 그냥 지나쳤던 터라 생각난 김에 좀 살펴봤다.


스칼라로 구현하면 다음과 같다. 
동일한 방식으로 foldr을 foldl로 구현하는 코드는 다음과 같다.
복잡해 보이지만 차곡차곡 합성해서 하나의 함수로 만드는 간단한 코드다.


덧셈을 생각해 보면 이해가 쉽다. 

1,2,3 을 foldRight로 표현하면 (1 + (2  + (3 + 초기값)))과 같이 된다. 함수를 만드는 과정은 다음과 같다.

1 + 우측계산함수.call(0), 1 + (2 + 우측계산함수.call(0)), 1 + (2 + (3 + 우측계산함수.call(0)).

우선, 우측계산함수를 g라 하면 g.call(0) = 0, 따라서 ->b { b }. 즉, foldLeft(리스트, ->b {b}) {|g,a| .... }(0)

이전단계까지의 함수 g와 리스트 값 a가 주어지면, 값을 받아서 덧셈을 수행하는 함수를 만들자.

말을 그대로 옮기면 된다. foldLeft(리스트, ->b {b}) {|g,a| ->b { g[덧셈[a,b] } }.call(0) 완성.


루비코드로 옮기면 다음과 같다. 위의 두가지 스칼라 코드가 쉽게 다가올 것이다..

글로 옮겨서 길어졌지만, 사실은 리듀스, 합성 구문이 익숙하면 풀이가 필요없는 당연한 내용이다


결론, 특별히 사고가 필요하거나 기법을 요구해서 어려운 것이 아니라 익숙치 않기에 어려운 것들이 있다.

이 문제 또한 마찬가지고 함수형 프로그래밍이란 주제 또한 그런 범주에 있다.

눈에 쉽게 들어오지 않으니 기초를 반복해서 보거나 과도하게 어렵게 치부하는데 그럴 필요없다.

경험이 임계치에 도달하면 해결되는 일이다. 그리고 경험의 임계치란 것은 종종 놀라만큼 적다..

Redux 구현해보기(3) - 미들웨어 비동기 구현 IT

redux 미들웨어에서 시간이 걸리는 요청이 발생하면 어떻게 동작할까?
: 요청  > 미들웨어 > 시간이 걸리는 동작(완료될 때 까지 블록) > 미들웨어 > 응답(완료까지 블록)


응답이 도착할 때 까지 블록되는 것은 원치 않으므로

백그라운드에서 비동기로 상태가 반경되는 것이 좋겠다. 무엇이 필요할까?
  • 비동기를 고려한 상태 설계 : 시간이 소요되므로 처리상태(요청, 성공, 실패)와 처리시간을 기록할 수 있어야 한다.
  • 백그라운드 프로세싱 및 체이닝 : 백그라운드_처리(시간이 걸리는 작업).then(다음 작업).then(다음 작업)
미들웨어는 동기처리를 유지하지만, 액션에 따라 비동기로 동작하게 하자.


이를 가능하게 하는 비동기 액션 생성자와

함수형태의 비동기 액션을 구동시키는 thunk 미들웨어 두가지를 구현해봤다.



1) 비동기 액션 생성자 : fetch_posts(reddit)

액션생성자를 함수(동기와 비동기 dispatch 처리가 혼합된 코드블록)로 정의한다.
(리듀서는 상태변경에 대한 것이지 동기/비동기 메커니즘에 대한 것은 아니므로 reducer에 담지 않는다.
(액션에 따라서 동기/비동기를 달리하므로 액션내에 비동기 코드블록을 담도록 한다.


동기액션은 dispatch을 호출해서 미들웨어까지 동기적으로 처리완료 되도록 하고

비동기액션은 Concurrent.future {레딧json요청}.then{파싱}.then{dispatch} 처럼

백그라운드 작업을 순차적으로 진행한 뒤 dispatch를 호출해서 

시간이 소요되는 작업 처리-상태변경-미들웨어 적용이 백그라운드에서 진행되도록 한다.
(백그라운드 프로세싱과 체이닝은 concurrent-edge gem의 future, 체이닝을 사용했다.


2) thunk 미들웨어

코드블록 형태의 lambda 액션과 
기본 hash 액션을 구동하는 미들웨어가 필요하다.

thunk란 미들웨어를 만들고 미들웨어 스택에 추가한다.
logger로 찍은 stdout은 다음과 같다.
며칠간 redux에서 주제가 되는 것들을 대략적으로 루비로 구현해 봤다.
(combine_reducer, subscribe, 미들웨어 스택, 미들웨어 작성, 비동기 액션생성자, thunk 까지 완료.
(그 밖의 상태간 트랜잭션이나, 보일러 플레이트 축소등은 흥미가 떨어져 여기서 멈췄다.


Redux 유익하고 재
미있었다. 

Redux 구현해보기(2) - 미들웨어 스택 IT

미들웨어란 핸들러스택을 의미한다.

처리결과를 다음 핸들러에 연쇄적으로 전달하는 방식으로

복잡한 처리를 단순화시킬 수 있다. (요청 > 핸들러1~n > 어플리케이션)


미들웨어 스택은 핸들러 파이프 개념을 갖는다. 루비로 구현하면 다음과 같은식이다.

Redux도 복잡한 처리를 위해서 디스패처를 연쇄시킬 필요성이 생길 수 있다.

Redux의 미들웨어 스택을 위와 같은 느낌으로 다음과 같이 구현할 수 있다.
간단한 샘플

실행결과. (로거 > 레코더 > 어플리케이션 순으로 진입해서 역순으로 연쇄적으로 처리된다.)
특별한건 없다. 


덧, Redux 홈의 몽키패칭 > 숨기기 > 제거 > 미들웨어 완성 부분은 읽어볼만하다. 

덧, 시나트라 + Rack의 핸들러 스택은 다음과 같은 모양이다. 그럴듯하다.


1 2 3 4 5 6 7 8 9 10 다음