use*_*441 1 swap arguments scala syntax-error function-definition
我是Scala语言的新手,我试图定义一个可以翻转其参数的基本函数,我这样定义它:
var flipArguments = ((a: Any, b: Any) => Any ) => ((b: Any, a: Any) => Any)
但是我遇到了一个编译错误,该错误突出显示了带有消息的第二个箭头
';' or newline expected
Run Code Online (Sandbox Code Playgroud)
而且我不明白我在哪里犯语法错误。
这取决于您翻转的意思。
如果你是那个意思
var a = 1
var b = 2
flip(a, b)
Run Code Online (Sandbox Code Playgroud)
应该会导致结果a为2和b1,就像使用C ++中的引用所做的那样,那么这在Scala中是不可能的。这是一个解释。
佩德罗的帖子已经很好地回答了这一问题。如果这是您想要的,那么您可能应该使用泛型,正如Luis在评论中提到的那样。
给定您尝试编写的签名,您的尝试对我来说就像是您尝试编写一个获取一个函数f并返回一个新函数的函数,该函数与相同f,但参数顺序相反。
您可以编写这样的函数:
def flipAny(f: (Any, Any) => Any): (Any, Any) => Any =
(a, b) => f(b, a)
Run Code Online (Sandbox Code Playgroud)
然后在这样的函数上调用它:
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
Run Code Online (Sandbox Code Playgroud)
但是,我们可以做得更好,因为Any到处使用都会删除有价值的类型信息。
如果我们尝试使用字符串结果,会发生什么stringify?
println(stringify(1,2).length) // prints 10
//println(flipAny(stringify)(1,2).length) // doesn't compile
Run Code Online (Sandbox Code Playgroud)
第二行不编译,因为flipAny返回的函数返回Anynot String。
这是使用泛型的另一个定义:
def flip[A, B, C](f: (A, B) => C): (B, A) => C =
(a, b) => f(b, a)
Run Code Online (Sandbox Code Playgroud)
这样好多了。我们从得到一个功能A,并B以C和返回功能B,并A到C。这将保留类型信息:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |