有人可以在OOP上下文中提供方法与函数的简单解释吗?
class Person(val name:String,var age:Int )
def person = new Person("Kumar",12)
person.age = 20
println(person.age)
Run Code Online (Sandbox Code Playgroud)
这些代码行输出12,即使person.age=20已成功执行.我发现这是因为我使用了def def person = new Person("Kumar",12).如果我使用var或val,则输出为20.我理解scala中的默认值是val.这个:
def age = 30
age = 45
Run Code Online (Sandbox Code Playgroud)
...给出编译错误,因为它默认为val.为什么上面的第一组行不能正常工作,而且还没有错误?
什么是提前终止折扣的最佳方式?作为一个简化的例子,想象一下,我想总结一下数字Iterable,但如果我遇到一些我不期望的东西(比如一个奇数),我可能想要终止.这是第一个近似值
def sumEvenNumbers(nums: Iterable[Int]): Option[Int] = {
nums.foldLeft (Some(0): Option[Int]) {
case (Some(s), n) if n % 2 == 0 => Some(s + n)
case _ => None
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这个解决方案非常难看(如果我做了.foreach和返回 - 它会更清晰和更清晰),最糟糕的是,它遍历整个迭代,即使它遇到非偶数.
那么编写像这样的折叠最好的方法是什么呢?我应该去递归地写这个,还是有一个更被接受的方式?
我正在观看Runar Bjarnason的初学者函数式编程,并在14:45他定义了一个方法:
def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0
Run Code Online (Sandbox Code Playgroud)
和功能:
val isEven = isDivisibleBy(2)
Run Code Online (Sandbox Code Playgroud)
定义isEven为函数而不是方法的优点和缺点是什么?
我已经阅读了Scala函数与方法以及Scala中方法和函数之间的区别,并且我理解语义差异,但我想知道在这种情况下是否有更深层次的原因为什么函数可能或可能不优于使用方法:
def isEven = isDivisibleBy(2)
Run Code Online (Sandbox Code Playgroud) Scala和F#采用的方法在统一OO和FP范例方面有哪些主要区别?
编辑
每种方法的相对优点和缺点是什么?如果,尽管支持子类型,F#可以推断函数参数的类型然后为什么不能Scala?
为什么return匿名函数中的显式返回语句(使用关键字的语句)从封闭的命名函数返回,而不仅仅是来自匿名函数本身?
例如,以下程序导致类型错误:
def foo: String = {
((x: Integer) => return x)
"foo"
}
Run Code Online (Sandbox Code Playgroud)
我知道建议避免使用return关键字,但我很感兴趣为什么显式和隐式返回语句在匿名函数中具有不同的语义.
在下面的示例中,return语句m在执行完毕后"幸存" ,并且程序导致运行时异常.如果匿名函数没有从封闭函数返回,则无法编译该代码.
def main(args: Array[String]) {
m(3)
}
def m: (Integer => Unit) =
(x: Integer) => return (y: Integer) => 2
Run Code Online (Sandbox Code Playgroud) 以下代码来自http://www.scalaclass.com/book/export/html/1来做矩阵点积.
我无法理解大括号之间的语法.
谢谢.
type Row = List[Double]
type Matrix = List[Row]
def dotProd(v1:Row, v2:Row) =
v1.zip(v2).map{ t:(Double, Double) => t._1 * t._2 }.reduceLeft(_ + _)
Run Code Online (Sandbox Code Playgroud) 无论我到哪里,我都会看到多个参数列表和currying用于互换的术语.我在几十个stackoverflow问题中看到它,甚至在scala-lang.org上. 例如,该页面的标题为"Currying".而第一句话?"方法可以定义多个参数列表."
然而,当一些知识渊博的人看到多个参数列表并且等同于curry时,他们会感到恼火.我发布了这个问题的答案,但后来当我看到Randall Schulz的评论时将其删除,因为我担心我可能会无意中传播错误的信息.我的理解是,具有多个参数列表的函数必然是一个curried函数,但是函数currying也可以通过其他方式实现(这个问题的最佳答案列出了四种方式),但我不确定这是整个故事.我想真正理解这种区别.
我知道在stackoverflow 上有很多非常相似的问题,但是我没有找到一个能够准确地说出差异的问题.关于多个参数列表和currying,我需要了解什么才能准确地说出它们?
特定
trait Foo {
type Bar
}
Run Code Online (Sandbox Code Playgroud)
是否有合法的方法来编写类似的东西f: (x: Foo) => x.Bar,以便函数的返回类型取决于参数?使用的一个例子是
def compareOutput(x1: Foo, x2: Foo)(f: (x: Foo) => x.Bar /* illegal */)(comparer: (x1.Bar, x2.Bar) => Boolean) = {
val y1 = f(x1)
val y2 = f(x2)
comparer(y1, y2)
}
Run Code Online (Sandbox Code Playgroud) 假设我有这个:
val myAnon:(Option[String],String)=>String = (a:Option[String],defVal:String) => {
a.getOrElse(defVal)
}
Run Code Online (Sandbox Code Playgroud)
不要介意这个功能.有没有把它变成通用的,所以我可以有一个选项[T]?