6

Scala 中是否有替代的“列表”语法?是否可以定义一个名为“[”和“]”的附加类/类型/运算符*?

我知道“方括号”用于表示类型,但它们非常适合声明列表的重复任务。

一种 ';' 或者 '?' 作为最后的资源也会很好。

谢谢

obs.:经过大量搜索,我发现唯一的选择是使用“缺点”:

val list = 1 :: 2 :: 3 :: Nil

但它根本不会减少任何键输入。

  • 我还在 Scala 中学习这些东西

编辑:只是为了澄清:在我的情况下,性能不是优先事项。是的,不欢迎换班。:P 幕后动机:我喜欢 Haskell 风格,但不能直接在 Java 中使用。

编辑 2:基于两种 Rex Kerr 解决方案的最终解决方案

实现对象类型:

package a
object Types {
  type \[z] = List[z]
  implicit def make_lists[A](z: A) = new ListMaker(z)

  class ListMaker[A](a0: A) {
    private[this] val buffer = List.newBuilder[A]
    buffer += a0
    def \(z: A) = {
      buffer += z;
      this
    }
    def \\ = buffer.result
  }
}

使用对象类型:

package a
import a.Types._

object Whatever {
  def listInListOut (l: \[Int]) = {
    1\2\\
  }
}
4

5 回答 5

12

[并且]是 Scala 中用于类型注释的保留符号。您不能将它们用于列表。 ;为行尾保留。你可以?在很多情况下使用,但这会很尴尬。

我建议你学习使用::符号(并习惯于:连续两次快速键入符号),因为它确实使列表操作在视觉上清晰,而且它是一个很好的语法提醒,列表很奇怪,因为你把东西放在了头上的名单。

但是,如果您不能容忍这种情况,您最好的选择可能是定义一个单字母列表符号。例如,

List(1,2,3,4)

是从 1 到 4 的数字列表。如果您可以只键入L而不是List怎么办?事实证明你可以,因为这不是一个花哨的构造函数或静态方法,而是类的单例伴侣对象List。所以你只是

val L = List
L(1,2,3,4)

而你只是比你建议的括号更糟糕的一个字符。

于 2011-05-30T03:22:08.767 回答
3

定义

def l[A](a:A*) = List(a:_*)

然后你可以做

l(1,2,3)

只多一个字符[1,2,3]

于 2011-05-30T03:21:59.730 回答
3

如果您真的讨厌 shift 键并且不在乎其他人是否能理解您的代码,我不禁指出另一种方法可以在这里找到所有元素都是相同类型的列表:

class ListMaker[A](a0: A) {
  private[this] val buffer = List.newBuilder[A]
  buffer += a0
  def \(a: A) = { buffer += a; this }
  def \\ = buffer.result
}
implicit def make_lists[A](a: A) = new ListMaker(a)

现在您可以随心所欲地列出内容,而无需触摸 shift 键!

scala> val a = 1\2\3\4\5\\
a: List[Int] = List(1, 2, 3, 4, 5)

scala> val b = 'a'\'b'\\
b: List[Char] = List(a, b)

scala> val c = false\true\false\false\false\false\true\\
c: List[Boolean] = List(false, true, false, false, false, false, true)

这使用与括号一样多的字符。(但是,它的嵌套不好。)

于 2011-05-30T04:05:19.103 回答
1
Welcome to Scala version 2.10.0.r24777-b20110419020105 (Java HotSpot(TM) Client VM, Java 1.6.0
Type in expressions to have them evaluated.
Type :help for more information.

scala> class LM[A](x: A) {
     |   def \(y: A) = List(x,y)
     | }
defined class LM

scala> implicit def a2l[A](x: A): LM[A] = new LM(x)
a2l: [A](x: A)LM[A]

scala> class LX[A](xs: List[A]) {
     |   def \(y: A) = xs:::List(y)
     | }
defined class LX

scala> implicit def l2lx[A](xs: List[A]): LX[A] = new LX(xs)
l2lx: [A](xs: List[A])LX[A]

scala> 1\2
res0: List[Int] = List(1, 2)

scala> 1\2\3
res1: List[Int] = List(1, 2, 3)

scala>
于 2011-05-30T06:41:25.003 回答
1

不完全是替代语法,但它是迄今为止最便携的解决方案:在 Intellij IDEA 中,可以创建“实时模板”;按Ctrl+Alt+s;搜索“模板”;转到“实时模板”部分;只需在 Scala 条目中添加一个名为“l”的新项目,添加随机描述和以下代码:

List($END$)

按 Enter,转到编辑器,按 L,然后按 Tab。这是您打字痛苦的结束。对数组做同样的事情。

于 2013-10-07T02:39:33.620 回答