多个参数列表,例如def foo(a:Int)(b:Int) = {}
每个列表的多个参数,例如def foo(a:Int, b:Int) = {}
,就我所知,在语义上是等效的,并且大多数函数语言只有一种方式来声明多个参数,例如F#.
我可以找到支持这两种函数定义样式的唯一原因是允许使用只有一个参数的参数列表进行类似语法的语言扩展.
def withBufferedWriter(file: File)(block: BufferedWriter => Unit)
Run Code Online (Sandbox Code Playgroud)
现在可以使用syntax-looking调用
withBufferedWriter(new File("myfile.txt")) { out =>
out write "whatever"
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果没有多个参数列表,可能还有其他方法可以支持花括号的使用.
一个相关的问题:为什么在Scala中使用多个参数列表称为"currying"?Currying通常被定义为为了支持部分应用而使n-ary函数一元化的技术.但是,在Scala中,可以部分应用函数,而不会使函数的"curried"(多个参数列表,每个参数列表).
我试图通过尝试使用Scalatra来进入Scala.我不久前在课程上完成了Martin Odersky的课程,但我仍然很难理解这是如何工作的:
package com.example.app
import org.scalatra._
class HelloWorldApp extends ScalatraFilter {
get("/") {
<h1>Hello, {params("name")}</h1>
}
}
Run Code Online (Sandbox Code Playgroud)
此示例取自Scalatra主页:http://www.scalatra.org/
如何执行此声明:
get("/") { Hello, {params("name")} }
是{}
参数的get()
方法吗?你能解释一下Scala语言的哪些特性在使用吗?Scalatra源代码的指针将是完美的定义,这将是完美的.
我想澄清有关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会有什么好处吗?
我试图理解这个概念,但功能编程的力量在我看来还很弱,所以我无法立即掌握它.我希望做的是定义一个可重复使用的模板函数的一些参数,但在Html
身体以及.
例如,考虑模板中的以下可重用函数:
@myFunction(label: String, labelTarget: String, content: Html) = {
<label for="@labelTarget">@label</label>
<div>@content</div>
}
Run Code Online (Sandbox Code Playgroud)
我想用这个函数如下:
...
<h2>My function content below!</h2>
@myFunction("label", "target") {
<span>My additional content used by the function</span>
}
...
Run Code Online (Sandbox Code Playgroud)
我觉得这应该是可行的,但似乎无法弄明白.有帮助吗?
我将参加优秀的Martin Odersky的FP课程讲座,其中一个讲座通过Newton的方法演示高阶函数,以找到某些函数的固定点.在讲座中有一个重要的步骤,我认为类型签名被违反,所以我会要求解释.(对于入境的长篇介绍道歉 - 它觉得有必要.)
实现这种算法的一种方法是这样的:
val tolerance = 0.0001
def isCloseEnough(x: Double, y: Double) = abs((x - y) / x) / x < tolerance
def fixedPoint(f: Double => Double)(firstGuess: Double) = {
def iterate(guess: Double): Double = {
val next = f(guess)
if (isCloseEnough(guess, next)) next
else iterate(next)
}
iterate(firstGuess)
}
Run Code Online (Sandbox Code Playgroud)
接下来,我们尝试通过fixedPoint函数计算平方根,但尝试通过
def sqrt(x: Double) = fixedPoint(y => x / y)(1)
Run Code Online (Sandbox Code Playgroud)
因为这样的方法振荡(因此,sqrt(2)
结果将无限期地在1.0和2.0之间交替)被挫败.
为了解决这个问题,我们引入平均阻尼,因此基本上我们计算两个最接近的计算值的平均值并收敛到解
def sqrt(x: Double) = fixedPoint(y => (y + x / y) / 2)(1)
Run Code Online (Sandbox Code Playgroud)
最后,我们介绍averageDamp …
我从https://index.scala-lang.org/playframework/play-json得到了这段我不完全理解的代码:
implicit val locationReads: Reads[Location] = (
(JsPath \ "lat").read[Double](min(-90.0) keepAnd max(90.0)) and
(JsPath \ "long").read[Double](min(-180.0) keepAnd max(180.0))
)(Location.apply _)
Run Code Online (Sandbox Code Playgroud)
这是什么(...)(...)
意思?我查看了 Scala 语法备忘单,但仍然无法弄清楚它是什么。先感谢您!
来自不同的编程语言(主要是解释)后,我正在学习Scala.我正在做以下练习,我收到一个错误.
def sum(f: Int => Int)(a: Int, b: Int): Int = {
def loop(a: Int, acc: Int): Int = {
if (a >= b) acc
else loop(a+1, f(a) + acc)
}
loop(a, 0)
}
sum(x => x * x, 2, 4) //Too many arguments
Run Code Online (Sandbox Code Playgroud)
我看不出那里有什么问题?
用foldl
它来查看代码很难理解它的语法,例如:
def lstToMap(lst:List[(String,Int)], map: Map[String, Int] ):Map[String, Int] = {
(map /: lst) (addToMap)
}
Run Code Online (Sandbox Code Playgroud)
是中/:
缀运营商?什么(map /: lst)
意思,部分申请?为什么我不能这样打电话:
`/: map lst addToMap`
Run Code Online (Sandbox Code Playgroud)