Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala REPL中使用'val'和'def'进行函数定义的区别是什么?_Scala_Functional Programming - Fatal编程技术网

在Scala REPL中使用'val'和'def'进行函数定义的区别是什么?

在Scala REPL中使用'val'和'def'进行函数定义的区别是什么?,scala,functional-programming,Scala,Functional Programming,我在Scala REPL中定义了两个函数(方法): scala> val b=(x:Int)=>x+1 b: Int => Int = <function1> scala> def c(x:Int)=x+1 c: (x: Int)Int 虽然这两个定义都有效,但似乎b和c有不同的类型。我想知道他们之间是否有一些区别。为什么Scala对b和c不使用相同的类型?有人对此有想法吗 不重复: 此问题不是链接问题的重复。尽管 它询问使用def和val定义 函数,代

我在Scala REPL中定义了两个函数(方法):

scala> val b=(x:Int)=>x+1
b: Int => Int = <function1>

scala> def c(x:Int)=x+1
c: (x: Int)Int
虽然这两个定义都有效,但似乎
b
c
有不同的类型。我想知道他们之间是否有一些区别。为什么Scala对
b
c
不使用相同的类型?有人对此有想法吗


不重复:

此问题不是链接问题的重复。尽管 它询问使用def和val定义 函数,代码示例表明询问者很困惑 关于Scala中方法和函数之间的差异。这个 示例根本不使用def定义函数亚伦 诺夫斯特鲁普7小时前


使用
def
创建一个方法(对于REPL,它将在某个全局不可见对象中创建一个方法),
val
将创建一个匿名函数,并将其分配给指定的符号

当调用它们时,它们几乎是相同的东西;当您传递它们时,会有差异,但是Scala通过透明地执行ETA扩展来隐藏它。例如,如果您定义以下内容:

def isEven(i: Int): Boolean = i % 2 == 0
然后打电话

list.filter(isEven)
Scala正在以一种类似于使用
val
的方式为您转换它;将其视为伪代码,因为我不太了解scala的内部结构,但在高层,会发生以下情况:

list.filter((i: Int) => isEven(i))

其中一个问题将为每次调用生成新的函数实例。此问题不是链接问题的重复。尽管它询问了使用
def
val
定义函数之间的区别,但代码示例清楚地表明询问者对此感到困惑。该示例根本不使用
def
来定义函数。
list.filter((i: Int) => isEven(i))