Scala arm を Scalaz と組み合わせて、ちょっとだけ短くよべるようにしたけど、まだちょっと納得がいかない

for{
  a <- managed(new FooStream())
  b <- managed(new BarStream())
  c <- managed(new BazStream())
} yield func(a,b,c)

っていうのが、

(managed(new FooStream()) |@| managed(new BarStream()) |@| managed(new BazSeam()) )(func)

って書けて、変数名いらなくなりますね!っていうだけのもの?

https://github.com/scalaz/scalaz/tree/6.0.3
https://github.com/jsuereth/scala-arm/tree/1.0

Monad または Applicative にもしようとしたけれど、pure

https://github.com/scalaz/scalaz/blob/6.0.3/core/src/main/scala/scalaz/Pure.scala#L7

implicit val ManagedResourcePure = new Pure[ManagedResource] {
  def pure[A](a: => A): P[A] // Resource はいつどうやって渡せば?
}

ってできないので無理ぽ?(´・ω・`)

https://github.com/jsuereth/scala-arm/blob/1.0/src/main/scala/resource/package.scala#L15

scala-arm の package object のmanagedを呼び出して、Pureの instance を作りたいが、

https://github.com/jsuereth/scala-arm/blob/1.0/src/main/scala/resource/AbstractManagedResource.scala#L89

DefaultManagedResourceのコンストラクタの implicit の引数の

DefaultManagedResource[R : Resource : Manifest](r : => R)


が、(Pureを生成する時点で) タイミング的に受け渡すの無理?だとしたらどうすれば?いやこれで十分なのかな?