Free
Freeモナドです。バージョン7.1以前と7.2以降で、ある程度構造が異なっています。 7.2以降は、いわゆる
Operational Monad
と呼ばれる形式になっており、大抵のメソッドでFunctor
の制約が必要なくなっています。
Haskellと異なり、Haskellのものを単純に真似て実装するとstack overflowしてしまうので、一工夫されています。 それについての詳細は、@runaroramaさんが書いた
Stackless Scala With Free Monads
を読むといいでしょう。
@runaroramaさんは、FP in Scalaの著者であり、Scalazの主要コミッターの一人です。