2016년 2월 4일 목요일

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

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

댓글 1개:

  1. Applicative 로..

    length <$> (intersect <$> (friendsOf x) <*> (friendsOf y))

    Do 로..

    do { fx <- friendsOf x; fy <- friendsOf y; return (length(intersect fx fy)) }

    Haskell은 Applicative Do 가 생겨서 위 Do 표기를 Applicative로 자동 변환하고, Haxl은 트릭으로 <*>를 ap과 다르게 구현하여 이득을 보는 구조.

    Scala의 for는 자동으로 flatMap/map/filterWith로 변환되므로 Haskell 처럼 Compiler확장을 이용하는 것이 아니라면 명시적으로 flatMap 대신 Applicative의 map2나 traverse/sequenceA가 사용될 수 있게 해줘야 함.

    그래서 Stitch 등의 라이브러리는 join같은 연산자를 제공. https://youtu.be/VVpmMfT8aYw?t=7m7s

    for {
    (fx,fy) <- Stitch.join(friendsOf(x), friendsOf(y))
    ...
    }

    답글삭제