Scala通用Monad功能?

时间:2016-06-21 04:27:35

标签: scala functional-programming polymorphism monads scalaz

在scala中,如果我想使用pure(或类似的东西),我如何编写一个monad的泛型函数?就像Haskell中的这个签名一样:

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

问题是,我找不到通用的purereturn,因此我无法真正将a打包到monad m中。

1 个答案:

答案 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, ?]]