我想澄清有关scala currying的好处.根据"Scala第二版编程" - "currying一种用多个参数列表编写函数的方法.例如,
def f(x: Int)(y: Int)带有两个参数列表的curried函数.通过传递多个参数列表来应用curried函数,如:f(3)(4).但是,也可以编写curried函数的部分应用,例如f(3)." "c"
与创建相关的一个好处是部分应用了这样的功能
def multiplyCurried(x: Int)(y: Int) = x * y
def multiply2 = multiplyCurried(2) _
Run Code Online (Sandbox Code Playgroud)
但是我们也可以使用部分应用的函数而不用currying
def multiplyCurried(x: Int,y: Int)
def multiply2 = multiplyCurried(2, _)
Run Code Online (Sandbox Code Playgroud)
你能举几个例子,currying会有什么好处吗?
根据API http://slick.typesafe.com/doc/3.0.0/api/#slick.driver.JdbcActionComponent $SimpleInsertActionComposer
insertOrUpdate == 如果表中不存在其主键,则插入单行,否则更新现有记录。
我可以通过自定义字段 insertOrUpdate 吗?
我通过 2 个查询解决了它
def insertOrUpdate(name: String) = {
Await.result(db.run(tableQ.filter(_.name === name).result), Duration.Inf).headOption match {
case Some(t) => Unit
case None => Await.result(db.run(tableQ += ...), Duration.Inf)
}
}
Run Code Online (Sandbox Code Playgroud)
可以通过 insertOrUpdate slick 做到这一点吗?
例如,如果递归几乎清楚
def product2(ints: List[Int]): Int = {
@tailrec
def productAccumulator(ints: List[Int], accum: Int): Int = {
ints match {
case Nil => accum
case x :: tail => productAccumulator(tail, accum * x)
}
}
productAccumulator(ints, 1)
}
Run Code Online (Sandbox Code Playgroud)
我不确定核心运行.根据维基百科的文章," corecursion允许程序产生任意复杂且可能无限的数据结构,例如流 ".例如这样的构造
list.filter(...).map(...)
Run Code Online (Sandbox Code Playgroud)
使得能够准备临时流filter和map操作之后.在filterstream 之后将只收集过滤后的元素,接下来map我们将更改元素.正确?
功能组合器map filter
是否使用递归执行是否有任何正文在Scala"比较递归和核心运行"中有很好的例子?
我有关于代码装饰的问题.
例如,我应该处理来自DAO的对象
val user1 = DAO.get(token)
val user2 = DAO.get(token)
val user3 = DAO.get(token)
Run Code Online (Sandbox Code Playgroud)
接下来我应该检查user.isDefined
if (user1.isEmpty || user2.isEmpty || user3.isEmpty ) {
return "error..."
}
else {
...
}
Run Code Online (Sandbox Code Playgroud)
提到的代码看起来像命令式的风格,它可以更具功能性吗?如何更改功能?
BR!