1

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

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

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

';' or newline expected

而且我不明白我在哪里犯了语法错误。

4

2 回答 2

5

这取决于你所说的翻转是什么意思。

像“改变两个变量的值”一样翻转

如果你的意思是

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

应该导致a为 2 和b1,就像 C++ 中的引用一样,那么这在 Scala 中是不可能的。这是一个解释

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

这已经在佩德罗的帖子中得到了完美的回答。如果这是你想要的,你可能应该使用泛型,正如 Luis 在评论中提到的那样。

翻转如“转动函数参数”

鉴于您尝试编写的签名,您的尝试在我看来就像您正在尝试编写一个函数,该函数获取一个函数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)

这要好得多。我们从和到获取一个函数,并从和到A返回B一个C函数。这保留了类型信息: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
于 2019-07-02T07:47:03.020 回答
1

也许你想要这样的东西:

def flipArguments(a:Any, b: Any): Any = (b, a)
于 2019-07-01T13:57:33.323 回答