【问题标题】:Scala generic Monad function?Scala通用Monad函数?
【发布时间】:2016-10-22 11:32:58
【问题描述】:
在 scala 中,如果我想使用 pure(或类似的东西),我将如何为一种 monad 编写通用函数?喜欢 Haskell 中的这个签名:
f :: Monad m => a -> m b
问题是,我没有找到通用的 pure 或 return,所以我不能真正将 a 打包到 monad m 中。
【问题讨论】:
标签:
scala
functional-programming
polymorphism
monads
scalaz
【解决方案1】:
Scalaz 有 point(在 scalaz.syntax.applicative 中),它还有别名 pure(所以你可以用下面的 pure 替换 point):
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, ?]]