0
スカラーの場合、pure
(またはそのようなもの)を使用したい場合、モナドの一種の汎用関数を書くにはどうすればよいですか? Haskellではこの署名のように:Scala汎用Monad関数?
f :: Monad m => a -> m b
事があり、私が見つけたジェネリックpure
かreturn
ありませんので、私は本当にモナドm
にa
を荷造りすることはできません。
スカラーの場合、pure
(またはそのようなもの)を使用したい場合、モナドの一種の汎用関数を書くにはどうすればよいですか? Haskellではこの署名のように:Scala汎用Monad関数?
f :: Monad m => a -> m b
事があり、私が見つけたジェネリックpure
かreturn
ありませんので、私は本当にモナドm
にa
を荷造りすることはできません。
Scalazは(scalaz.syntax.applicative
で)point
を持っており、それはまた、(あなたが以下pure
でpoint
を置き換えることができます)別名pure
があります
import scalaz._, Scalaz._
1.point[Option] // Option[Int] = Some(1)
1.point[List] // List[Int] = List(1)
それは少し難しく、複数の型パラメータを持つモナドのためです、その場合はラムダ型または型名を使用する必要があります。
1.point[({ type λ[α] = String \/ α })#λ] // \/[String,Int] = \/-(1)
type ErrorOr[A] = String \/ A
1.point[ErrorOr] // ErrorOr[Int] = \/-(1)
1.point[({ type λ[α] = Reader[Int, α] })#λ]
あなたはkind projectorコンパイラプラグインを使用して型ラムダを簡素化することができます:
1.point[String \/ ?]
1.point[Reader[Int, ?]]
を