【问题标题】:Scala generic Monad function?Scala通用Monad函数?
【发布时间】:2016-10-22 11:32:58
【问题描述】:

在 scala 中,如果我想使用 pure(或类似的东西),我将如何为一种 monad 编写通用函数?喜欢 Haskell 中的这个签名:

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

问题是,我没有找到通用的 purereturn,所以我不能真正将 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, ?]]
    

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多