扩展Scala的箭头表示法

ebr*_*hez 16 scala

Scala,in Predef,定义支持->?(这里清理了一下):

final class ArrowAssoc[A](val __leftOfArrow: A) extends AnyVal {    
    def -> [B](y: B): Tuple2[A, B] = Tuple2(__leftOfArrow, y)
    def ?[B](y: B): Tuple2[A, B] = ->(y)
}
Run Code Online (Sandbox Code Playgroud)

这样可以方便地使用箭头符号而不是普通元组语法创建对:

scala> "foo" ? 42
res0: (String, Int) = (foo,42)
Run Code Online (Sandbox Code Playgroud)

可以使用类型定义和提取器轻松扩展此箭头语法(此处仅?显示):

type ?[A, B] = (A, B)
object ? { def unapply[A, B](t: (A, B)) = Some(t) }
Run Code Online (Sandbox Code Playgroud)

这允许你写下这样的东西:

"a" ? 42 match { case a ? b ? println(s"found `$a` and `$b`") }
Run Code Online (Sandbox Code Playgroud)

和:

def foo[A, B](t: A ? B) = ???
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何理由Scala没有在其标准库中定义那些.这些定义有任何缺点吗?

Eri*_*ten 1

这是一个缺点。能够同时做到这两点

def foo[A, B](t: A -> B) = ???
Run Code Online (Sandbox Code Playgroud)

def foo[A, B](t: A => B) = ???
Run Code Online (Sandbox Code Playgroud)

会很混乱。如果类型不对齐,编译器当然会捕获它。然而,只有经验丰富的 Scala 程序员才能快速理解错误消息。