在scala中,如果我想使用pure
(或类似的东西),我如何编写一个monad的泛型函数?就像Haskell中的这个签名一样:
f :: Monad m => a -> m b
问题是,我找不到通用的pure
或return
,因此我无法真正将a
打包到monad m
中。
答案 0 :(得分:2)
Scalaz有point
(在scalaz.syntax.applicative
中)并且还有别名pure
(因此您可以将point
替换为下面的pure
):
import scalaz._, Scalaz._
1.point[Option] // Option[Int] = Some(1)
1.point[List] // List[Int] = List(1)
对于具有多个类型参数的monad来说有点困难,在这种情况下,您需要使用类型lambda或类型别名。
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编译器插件简化lambda类型:
1.point[String \/ ?]
1.point[Reader[Int, ?]]