2016년 2월 5일 금요일

(.:) = (.) (.) (.) -- concatMap

Haskell의 함수중 (.)만큼 많이 쓰이는 것이 있을까? compose 연산자다.

f . g = f (g x) 

그런데 (.)의 두번째 인자는 입력을 하나만 처리한다. concat xss 와 map f xs 의 concat 과 map 을 합성하려면?

concat . map -- 성립하지 않는다.

map 을 인자 하나면 처리하면 여전히 함수이며, 이는 concat의 입력타입([[x]])과 일치하지 않기 때문이다. 그래서...

concatMap f = concat . map f

map의 첫 인자를 적용한 상태로 합성하면 된다.  하지만 f를 제거하여 합성하고 싶다면???

concatMap = concat .: map

여기서 (.:)는 외우기 참 쉬운데, 정의는 모양 그대로 점셋(.:)을 펼쳐놓은 것 (.)(.)(.) 이며, 타입 역시 모양 그대로 왼쪽점 하나(왼쪽항이 인자 하나), 오른쪽 점 둘(오른쪽 항이 인자 둘을 처리)의 합성이다.

(.:) :: (c->d) -> (a->b->c) -> a->b->d
(.:) = (.)(.)(.)


2016년 2월 4일 목요일

length(intersect(friendsOf x)(friendsOf y))

Facebook의 HAXL소개에 늘 나오는 대표적 예제

iterate(group>=>(sequence[length,head]))[1]

국내엔 개미수열로 알려진 'look and say' 수열

#define BITS_TO_BYTES(bits) ((bits)/8 + !!((bits)%8))

C에서 비트필드배열 만들 때 쓸만할 것 같음.
#define BITS_A 5
#define BITS_B 3
#define BITS_C 2
char bitfield[BITS_TO_BYTES(BITS_A + BITS_B + BITS_C)];

2014년 3월 21일 금요일

do-while one-liner


List<E> cached = new ArrayList<E>(); do cached.add(persistableResource.loadFrom(cursor)); while (cursor.moveToNext()); return cached;

GitHub Android Client 코드 중에서 do-while의 중괄호마저 빼버린 코드를 봤다. 나름 잘 읽힌다. cursor를 Collection으로 보고 mapping한 것 같기도 하고.
이 코드에서 특히한 또다른 점은 try-finally 짝을 적극적으로 사용한다는 점이다.

2012년 7월 9일 월요일

list_entry 매크로

#define list_entry(ptr, type, member) \
  ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

리눅스 커널에 사용된 링크드리스트에서 제공하는 매크로. list_node 포인터로부터 원래 구조체의 포인터를 얻기 위해 사용한다.

2011년 11월 3일 목요일

Arithmetic on Functions


(sin 2.5)
#| .5984721441039565 |#


(square 2.5)
#| 6.25 |#


((+ sin square) 2.5)
#| 6.848472144103956 |#


((+ (square sin) (square cos)) 2.5)
#| 1. |#




Jerald Sussman 이 2011년 Strange Loop에서 발표한 자료에 위와 같은 예제가 살짝 소개된다. 이렇게 하려면 +를 재정의해줘야 겠지만, 이렇게 할 수 있다는 것이.. 흠..


그러나 J에서는 이미 아무 문제 없이 가능한 이야기이다.


   cos=:2&o.
   sin=:1&o.
   square=:*:
   sin 2.5
0.598472
   square 2.5
6.25
   (sin + square) 2.5
6.84847
   ( square@sin + square@cos ) 2.5
1





참고 1. https://thestrangeloop.com/sessions/we-really-dont-know-how-to-compute