2016-06-21 14 views
0

スカラーの場合、pure(またはそのようなもの)を使用したい場合、モナドの一種の汎用関数を書くにはどうすればよいですか? Haskellではこの署名のように:Scala汎用Monad関数?

f :: Monad m => a -> m b 

事があり、私が見つけたジェネリックpurereturnありませんので、私は本当にモナドmaを荷造りすることはできません。

答えて

2

Scalazは(scalaz.syntax.applicativeで)pointを持っており、それはまた、(あなたが以下purepointを置き換えることができます)別名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, ?]]