Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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中指定lambda返回类型_Scala_Types_Lambda - Fatal编程技术网

在Scala中指定lambda返回类型

在Scala中指定lambda返回类型,scala,types,lambda,Scala,Types,Lambda,注:这是一个理论问题,我不是在试图解决任何问题,也不是为了达到实际目的而试图取得任何效果 在Scala中使用(arguments)=>表达式语法创建lambda时,是否可以显式提供返回类型 lambda与方法没有什么不同,它们都被指定为表达式,但据我所知,方法的返回类型很容易用def name(arguments):return type=expression语法定义 考虑以下(说明性)示例: 我自己也不知道答案,因为我从来就不需要它,但我的直觉是这会奏效。并在工作表中尝试确认了这一点 编辑:在

注:这是一个理论问题,我不是在试图解决任何问题,也不是为了达到实际目的而试图取得任何效果

在Scala中使用
(arguments)=>表达式
语法创建lambda时,是否可以显式提供返回类型

lambda与方法没有什么不同,它们都被指定为表达式,但据我所知,方法的返回类型很容易用
def name(arguments):return type=expression
语法定义

考虑以下(说明性)示例:

我自己也不知道答案,因为我从来就不需要它,但我的直觉是这会奏效。并在工作表中尝试确认了这一点


编辑:在出现上述示例之前,我提供了这个答案。确实,在具体例子中不需要这样做。但是在极少数需要它的情况下,我展示的语法会起作用。

您可以通过附加
和类型来声明表达式的类型。例如:

((x: Int) => x.toString): (Int => String)
例如,如果您有一个大而复杂的表达式,并且不想依靠类型推断来获得正确的类型,那么这将非常有用

{
  if (foo(y)) x => Some(bar(x))
  else        x => None
}: (Int => Option[Bar])
// Without type ascription, need (x: Int)
但如果将结果指定给具有指定类型的临时变量,则可能更清楚:

val fn: Int => Option[Bar] = {
  if (foo(y)) x => Some(bar(x))
  else        _ => None
}

假设你有这个功能:

def mulF(a: Int, b: Int): Long = {
      a.toLong * b
}
相同的函数可以编写为lambda,具有定义的输入和输出类型:

val mulLambda: (Int, Int) => Long = (x: Int, y: Int) => { x.toLong * y }

嗯,你能用这个句子吗?别开玩笑了,请看我的编辑。我是Scala新手,所以我不太明白如何集成您的答案。在您的示例中,您不需要指定它是Int。因为Int已经是编译器推断的类型。为什么要在此处明确指定它?你可以(写
result:Int
),但这不会有任何区别。是的,我选择了一个不幸的例子。但是,让我们假设它是一个随机的lambda在中间,没有返回或任何东西…在打印脚本中,我们是如何做到这一点的,但是在斯卡拉,这是不起作用的,你需要指定类型作为一个函数,返回一个与上面所接受的答案一样的值,或者它不会编译。=>Int作为序列的返回类型。这已经强制您返回的lambda必须符合该类型,编译器将尝试将其解释为该类型。@ghik这只是一个不幸的例子……这似乎就是我要寻找的!然而:这是编译时检查还是强制转换?@yannbane这是编译时检查,而不是强制转换。在Scala中,为了使任何函数递归,我们需要指定一个返回类型,并且从2020.2.3开始,IntelliJ将无法自动建议返回类型,因此这个答案对于Scala编码人员来说非常重要。
def mulF(a: Int, b: Int): Long = {
      a.toLong * b
}
val mulLambda: (Int, Int) => Long = (x: Int, y: Int) => { x.toLong * y }