shapless2.2によるScalaにおけるFoldableのderivingとstack overflowとその回避策

shapeless2.2.0-RC1がリリースされる
http://notes.implicit.ly/post/113543562389/shapeless-2-2-0-rc1


この前書いたように
ついにScalaでもderiving Functorできるようになるらしい!?
ということらしいので
「Functorができるのなら、Foldableもできるのでは?」と思いつき、試してみる

完成╭(๑・ㅂ・)و ̑̑
https://gist.github.com/xuwei-k/9d815c756744e8b43fb7

しかし、巨大なリストで試すとstack overflowする

shapelessのgitterで質問する

scala.util.control.TailCallsを使った実装返ってくる(イマココ
https://gist.github.com/milessabin/488d2693588bf23ad3ab

なるほど・・・。
まぁscalaz.EqualやOrderのderivingもそうですが、心を込めて手作業でインスタンス定義したほうが(FoldableやFunctorの場合も?)効率いい、という残念な点は変わりないのかなぁ・・・。
しかし、パフォーマンス計測してみて、それなりに実用的というか許容範囲なら、FoldableやFunctor(おそらくTraverseやFoldable1やTraverse1も?)などをScalaでもderivingできるようになるのは、かなり便利なので、使いどころは結構あるかもしれません。



追記:
Scaladays2015サンフランシスコの発表で登場したらしい
https://github.com/milessabin/demo-scaladayssf-2015/blob/853ea7e60/src/main/scala/scaladays/scaladays.scala