scala中的隐式函数可以有2个输入参数吗?

scala中的隐式函数可以有2个输入参数吗?,scala,implicit,Scala,Implicit,我试图在scala中找到隐式函数的各种用例,但我发现示例中隐式函数只有一个参数,它可以有两个参数吗?如果是,它的用例也是什么,我想知道哪些是使用隐式函数的真实场景?Scala没有称为隐式函数的功能,但它确实有一个称为视图的功能,或者有时是隐式转换。它的工作原理如下:如果您有一个类型为A=>B的隐式值,或者一个可以在作用域中扩展为这样一个值的隐式定义,当您传递类型为A的值时需要一个类型为B的值,或者当您选择A.x时,在B上有一些x,但在A上没有,则首先调用该转换 那么一个隐式定义fooa:a:B=

我试图在scala中找到隐式函数的各种用例,但我发现示例中隐式函数只有一个参数,它可以有两个参数吗?如果是,它的用例也是什么,我想知道哪些是使用隐式函数的真实场景?

Scala没有称为隐式函数的功能,但它确实有一个称为视图的功能,或者有时是隐式转换。它的工作原理如下:如果您有一个类型为A=>B的隐式值,或者一个可以在作用域中扩展为这样一个值的隐式定义,当您传递类型为A的值时需要一个类型为B的值,或者当您选择A.x时,在B上有一些x,但在A上没有,则首先调用该转换


那么一个隐式定义fooa:a:B=???可以扩展为隐式val A=>B,并且是符合条件的隐式转换,但隐式def fooa:A,B:B:C=???不能,因此不符合转换条件。

Scala没有称为隐式函数的功能,但它确实有一个称为视图的功能,有时称为隐式转换。它的工作原理如下:如果您有一个类型为A=>B的隐式值,或者一个可以在作用域中扩展为这样一个值的隐式定义,当您传递类型为A的值时需要一个类型为B的值,或者当您选择A.x时,在B上有一些x,但在A上没有,则首先调用该转换

那么一个隐式定义fooa:a:B=???可以扩展为隐式val A=>B,并且是符合条件的隐式转换,但隐式def fooa:A,B:B:C=???不能,因此不符合转换条件。

可能是指方法扩展。您可以在此case或case类中扩展元组

此外,您还可以阅读官方文件

您可能指的是方法扩展。您可以在此case或case类中扩展元组

此外,您还可以阅读官方文件,请注意。现在是

我试图在scala中找到隐式函数的各种用例,但是我发现隐式函数只有一个参数,它可以有两个参数吗

对。它可以有任意多个参数。Scala 3中不再存在22参数限制

从中可以明显看出,没有限制:

上下文函数类型是用上下文参数定义apply方法的类类型的缩写。具体来说,N元函数类型T1,…,TN=>R是类类型ContextFunctionN[T1,…,TN,R]的缩写。对于N>=1的任何值,假定此类类类型具有以下定义:[……]

再往下看:

上下文函数类型以与函数类型相同的方式泛化到N>22

因此,很明显,可以有任意数量的参数

如果是,它的用例是什么

显而易见的用例是,如果您不想要单个上下文,而是想要用多个正交位组成上下文。设想一个场景,您需要日志记录和事务。没有理由认为这应该是一个单一的整体上下文

另外,我想知道哪些是使用隐式函数的真实场景

Scala3尚未发布,因此代码体仍然有限。使用Scala 3构建的最大系统可能是Scala 3编译器本身,它确实大量使用上下文函数。不过,没有上下文参数那么重

我怀疑绝大多数隐式函数都只有一个参数。但这不是人为限制它们的理由。Scala的一些主要目标是简单性、规则性和正交性,没有任何奇怪的例外或角落情况

方法可以有任意多个参数,普通函数可以有任意多个参数,类型构造函数可以有任意多个参数,构造函数可以有任意多个参数,事实上任何可以取参数的东西都可以取任意多个参数,人为地只限制隐式函数是很奇怪的

我的意思是,绝大多数类型构造函数、方法和普通函数可能也只有一个参数,或者最多两个,但我们也不限制它们。事实上,Products、元组、函数、PartialFunction和case类的任意22个参数限制一直是Scala 2中的一个重要问题。

请注意。现在是

我试图在scala中找到隐式函数的各种用例,但是我发现隐式函数只有一个参数,它可以有两个参数吗

对。它可以有任意多个参数。Scala 3中不再存在22参数限制

从中可以明显看出,没有限制:

上下文函数类型是用上下文参数定义apply方法的类类型的缩写。指定 实际上,N元函数类型T1,…,TN=>R是类类型ContextFunctionN[T1,…,TN,R]的缩写。对于N>=1的任何值,假定此类类类型具有以下定义:[……]

再往下看:

上下文函数类型以与函数类型相同的方式泛化到N>22

因此,很明显,可以有任意数量的参数

如果是,它的用例是什么

显而易见的用例是,如果您不想要单个上下文,而是想要用多个正交位组成上下文。设想一个场景,您需要日志记录和事务。没有理由认为这应该是一个单一的整体上下文

另外,我想知道哪些是使用隐式函数的真实场景

Scala3尚未发布,因此代码体仍然有限。使用Scala 3构建的最大系统可能是Scala 3编译器本身,它确实大量使用上下文函数。不过,没有上下文参数那么重

我怀疑绝大多数隐式函数都只有一个参数。但这不是人为限制它们的理由。Scala的一些主要目标是简单性、规则性和正交性,没有任何奇怪的例外或角落情况

方法可以有任意多个参数,普通函数可以有任意多个参数,类型构造函数可以有任意多个参数,构造函数可以有任意多个参数,事实上任何可以取参数的东西都可以取任意多个参数,人为地只限制隐式函数是很奇怪的


我的意思是,绝大多数类型构造函数、方法和普通函数可能也只有一个参数,或者最多两个,但我们也不限制它们。事实上,Products、元组、函数、PartialFunction和case类的任意22个参数限制一直是Scala 2中的一个重要问题。

Scala没有一个称为隐式函数的功能—虽然这在技术上是正确的,但我觉得你在吹毛求疵。是的,它们在去年夏天被重命名为上下文函数,是的,从技术上讲,Scala 3还没有发布,但很清楚OP在说什么。我自己从来没有听说过任何所谓的隐式函数。我假设他们谈论的是视图/隐式转换,但我不是100%确定。Scala 3上下文函数实际上完全是另一回事。上下文函数在其存在的几乎整个时间内都被称为隐式函数,绝大多数资源仍然这样调用它们。甚至连页面上的链接都称之为隐式函数。啊,的确如此。但是scala3/dotty隐式函数真的是问题的意思吗?我对此表示怀疑。@JörgWMittag无论你认为OP是否应该有其他含义,它的每一个外观都不是在谈论尚未发布的dotty特性的前一个名称。Scala没有一个称为隐式函数的特性——虽然这在技术上是正确的,但我觉得你在吹毛求疵。是的,它们在去年夏天被重命名为上下文函数,是的,从技术上讲,Scala 3还没有发布,但很清楚OP在说什么。我自己从来没有听说过任何所谓的隐式函数。我假设他们谈论的是视图/隐式转换,但我不是100%确定。Scala 3上下文函数实际上完全是另一回事。上下文函数在其存在的几乎整个时间内都被称为隐式函数,绝大多数资源仍然这样调用它们。甚至连页面上的链接都称之为隐式函数。啊,的确如此。但是scala3/dotty隐式函数真的是问题的意思吗?我对此表示怀疑。@JörgWMittag无论你认为OP是否应该有其他含义,它看起来都不是在谈论尚未发布的dotty功能的前名称。根据你删除的注释,你解释的是一个带有2个隐式参数的函数,我要找的是一个带2个参数的隐式函数你要找带多个参数的隐式转换这些链接能回答你的问题吗?重要的是带多个隐式参数的隐式def,因此,可能会保留多个普通参数的隐式def以保持一致性,尽管它们不是很有用。我的意思是,没有单普通参数隐式转换的隐式DEF或单/多隐式参数条件隐式的隐式DEF有用。根据您删除的注释,您解释的是一个具有2个隐式参数的函数,我要找的是一个有两个参数的隐式函数你要找的是有多个参数的隐式转换这些链接能回答你的问题吗?重要的是有多个隐式参数的隐式def,所以可能
带有多个普通参数的隐式def保持一致性,尽管它们不是那么有用。我的意思是,没有单普通参数隐式转换的隐式DEF或单/多隐式参数条件隐式的隐式DEF有用。似乎OP的意思不是Scala-3隐式函数,而是Scala 2中具有多个参数的隐式转换。我在这两个问题中都没有看到OP的任何声明或对任何答案的评论。在对删除答案的评论中,OP甚至重申他们询问的是隐式函数。从删除的Martijn的答案和Vivek的评论中,很明显Vivek OP调用def examplenormal:Int,params:Stringimplicit config:Configuration,context:ExecutionContext=???Martijn的代码片段是一个具有2个隐式参数的函数,但正在寻找一个具有2个参数的隐式函数,即,我猜,类似于隐式def examplenormal:Int,params:String。我将为那些看不到它的人复制删除的答案。似乎OP的意思不是Scala-3隐式函数,而是Scala 2中具有多个参数的隐式转换。我在任何答案的问题或注释中都没有看到OP的任何声明。在对删除答案的评论中,OP甚至重申他们询问的是隐式函数。从删除的Martijn的答案和Vivek的评论中,很明显Vivek OP调用def examplenormal:Int,params:Stringimplicit config:Configuration,context:ExecutionContext=???Martijn的代码片段是一个具有2个隐式参数的函数,但正在寻找一个具有2个参数的隐式函数,即,我猜,类似于隐式def examplenormal:Int,params:String的函数。不过,对于OP询问的那些看不到的人,我将复制删除的答案,这是一个与隐式类非常不同的概念。@JörgWMittag OP似乎没有询问Scala-3隐式函数。隐式类引入的扩展方法有时是隐式转换的合法替代,包括缺少多参数隐式转换。不过,OP询问的是与隐式类截然不同的概念。@JörgWMittag OP似乎没有询问Scala-3隐式函数。隐式类引入的扩展方法有时是隐式转换(包括缺少多参数隐式转换)的合法替代方法。
  def main(args: Array[String]): Unit = {
    val tuple = ("John", "Smith")
    val concat = tuple.tupleConcat
    println(concat)
  }

  implicit class TupleExt(val tuple: (String, String)) extends AnyVal {
    def tupleConcat = s"${tuple._1} ${tuple._2}"
  }