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)) ... }
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))
...
}