Scala: альтернативный синтаксис List (с квадратными скобками, если это возможно) - PullRequest
6 голосов
/ 30 мая 2011

Есть ли альтернативный синтаксис 'List' в Scala? Можно ли определить один дополнительный класс / тип / оператор *, называемый '[' и ']'?

Я знаю, что для обозначения типа используются квадратные скобки, но они идеально подходят для повторяющихся задач по объявлению списков.

A ';' или же '?' было бы хорошо также, как последний ресурс.

Спасибо

набл .: после долгих поисков единственной альтернативой, которую я нашел, было использование 'cons':

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

но это вовсе не уменьшает количество нажатий клавиш.

  • Я все еще изучаю эти вещи в Scala

EDIT: Просто чтобы уточнить: производительность не является приоритетом в моем случае. И да, сдвиг не приветствуется. :П Мотивация за кулисами: мне нравится стиль 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\\
  }
}

Ответы [ 5 ]

12 голосов
/ 30 мая 2011

[ и ] являются зарезервированными символами в Scala, которые используются для аннотаций типов.Вы не можете использовать их для списков.; зарезервировано для конца строки.Вы можете использовать ? во многих случаях, но это будет неудобно.

Я рекомендую вам научиться использовать нотацию :: (и привыкнуть к быстрому вводу символа : два раза подряд)потому что это действительно делает операции со списком визуально ясными, плюс это отличное синтаксическое напоминание о том, что списки странные, потому что вы помещаете вещи в начало списка.

Однако, если вы не можете это терпеть, лучшим вариантом будетвозможно, для определения однобуквенного символа списка.Например,

List(1,2,3,4)

- это список чисел от 1 до 4. Что если бы вы могли просто набрать L вместо List?Оказывается, вы можете, поскольку это не причудливый конструктор или статический метод, а объект-одиночка для класса List.Таким образом, вы просто

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

, и вы на один персонаж хуже, чем вы предлагаете в скобках.

3 голосов
/ 30 мая 2011

Я не могу не указать другой путь, чтобы перейти к спискам, в которых все элементы имеют одинаковый тип, если вы действительно ненавидите клавишу 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)

В нем используется ровно столько символов, сколько в скобках.(Однако, это не очень хорошо.)

3 голосов
/ 30 мая 2011

Определить

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

Затем вы можете сделать

l(1,2,3)

, что только на один символ больше [1,2,3]

1 голос
/ 30 мая 2011
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>
0 голосов
/ 07 октября 2013

Не совсем альтернативный синтаксис, но на сегодняшний день это наиболее переносимое решение: в Intellij IDEA можно создавать «живые шаблоны»;нажмите Ctrl + Alt + s;поиск по «шаблону»;перейти в раздел «Живые шаблоны»;Просто добавьте один новый элемент с именем «l» внутри записи Scala, добавьте случайное описание и следующий код:

List($END$)

Нажмите Enter, перейдите в редактор, нажмите L, а затем Tab.Это конец ваших печатных болей.Сделайте то же самое для массивов.

...