小编rom*_*usz的帖子

在模式匹配中隐含

我有一个方法,有很多隐含的参数:

def hello(message:String)(implicit a:A,b:B,c:C, ..., user: User) = {...}
Run Code Online (Sandbox Code Playgroud)

现在考虑这样一个类:

object Users extends Controller {
  implicit a: A = ...
  implicit b: B = ...
  ...

  def index(id:String) = Action {
     User.findById(id) match {
       case Some(user) => {
          implicit val _user = user
          hello("implicit")
       }
       case _ => BadRequest
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以在上面的例子中看到这一行:

implicit val _user = user
Run Code Online (Sandbox Code Playgroud)

它的存在只是为了使对象user成为一个隐式对象.否则,我必须打电话给hello:

hello("implicit")(a,b,c,... user)
Run Code Online (Sandbox Code Playgroud)

我在想是否有任何改进代码的方法,例如我们不需要定义那个_user变量但是user隐含它.

scala implicit pattern-matching playframework-2.0

7
推荐指数
1
解决办法
2054
查看次数

Reader monad有什么好处?

我读过一篇关于Readermonad 的博客文章.

帖子真的很棒,详细解释了这个主题,但我不明白为什么我应该Reader在这种情况下使用monad.

帖子说:假设有一个功能 query: String => Connection => ResultSet

def query(sql:String) = conn:Connection => conn.createStatement.executeQuery(sql)

我们可以运行一些查询,如下所示:

def doSomeQueries(conn: Connection) = {
  val rs1 = query("SELECT COUNT(*) FROM Foo")(conn)
  val rs2 = query("SELECT COUNT(*) FROM Bar")(conn)
  rs1.getInt(1) + rs2.getInt(1)
} 

到目前为止一直很好,但帖子建议使用Readermonad代替:

class Reader[E, A](run: E => A) {

  def map[B](f: A => B):Reader[E, B] =
    new Reader(?=> f(run(?)))

  def flatMap[B](f:A => Reader[E, B]): Reader[E, B] = …

monads functional-programming scala

6
推荐指数
1
解决办法
805
查看次数