定义翻转参数的函数

时间:2019-07-01 13:51:31

标签: scala arguments syntax-error swap function-definition

我是Scala语言的新手,我试图定义一个翻转参数的基本函数,我这样定义它:

@EnableJpaRepositories(basePackageClasses = {com.company.dao.UserDao.class})

但是我收到一个编译错误,突出显示了带有消息的第二个箭头

var flipArguments = ((a: Any, b: Any) => Any ) => ((b: Any, a: Any) => Any)

而且我不知道在哪里出现语法错误。

2 个答案:

答案 0 :(得分:5)

这取决于翻转的含义。

翻转为“更改两个变量的值”

如果你是那样

var a = 1
var b = 2
flip(a, b)

应该导致a为2,而b为1,就像使用C ++中的引用一样,那么这在Scala中是不可能的。这是explanation

翻转,如“以相反的顺序返回参数的元组”

Pedro's post中,这已经得到了完美的答案。 如果这是您想要的,那么您可能应该使用泛型,就像路易斯在评论中提到的那样。

如“翻转函数自变量”中那样翻转

鉴于您尝试编写的签名,您的尝试对我来说就像是您试图编写一个获取函数f并返回与f相同的新函数的函数,但是参数顺序相反。

您可以编写这样的函数:

def flipAny(f: (Any, Any) => Any): (Any, Any) => Any =
  (a, b) => f(b, a)

然后在这样的函数上调用它:

def stringify(a: Any, b: Any): String =
  s"a: ${a.toString}, b: ${b.toString}"

println(stringify(1,2))           // prints a: 1, b: 2
println(flipAny(stringify)(1,2))  // prints a: 2, b: 1

但是,我们可以做得更好,因为到处使用Any会删除有价值的类型信息。

如果我们尝试使用stringify的字符串结果会怎样?

println(stringify(1,2).length)            // prints 10
//println(flipAny(stringify)(1,2).length) // doesn't compile

第二行无法编译,因为flipAny返回的函数返回Any,而不是String

这是使用泛型的另一个定义:

def flip[A, B, C](f: (A, B) => C): (B, A) => C =
  (a, b) => f(b, a)

这好得多。我们正在从ABC的函数,并从BAC的函数。这将保留类型信息:

println(stringify(1,2))              // prints a: 1, b: 2
println(flip(stringify)(1,2))        // prints a: 2, b: 1
println(stringify(1,2).length)       // prints 10
println(flip(stringify)(1,2).length) // prints 10

答案 1 :(得分:1)

也许您想要这样的东西:

def flipArguments(a:Any, b: Any): Any = (b, a)