我有一个方法,有很多隐含的参数:
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隐含它.
帖子真的很棒,详细解释了这个主题,但我不明白为什么我应该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] = …