6

Scalaに代替の「リスト」構文はありますか? 「[」および「]」と呼ばれる 1 つの追加のクラス/タイプ/演算子* を定義することは可能ですか?

タイプを示すために「角括弧」が使用されることは知っていますが、リストを宣言するという繰り返しの作業には最適です。

';' また '?' 最後のリソースとしても良いでしょう。

ありがとう

obs .:多くの検索の後、私が見つけた唯一の代替手段は「cons」を使用することでした:

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

ただし、キーの入力はまったく減りません。

  • 私はまだScalaでそれらのことを学んでいます

編集: 明確にするために: 私の場合、パフォーマンスは優先事項ではありません。はい、シフトは歓迎されません。:P 舞台裏の動機: 私は Haskell スタイルが好きですが、Java で直接使用することはできません。

EDIT 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の予約済みシンボルです。リストには使用できません。 ;行末用に予約されています。多くの場合使用できますが?、扱いにくいでしょう。

表記法の使い方を学ぶことをお勧めします(そして、記号を2回続けてすばやく::入力することに慣れてください)。これにより、リストの操作が視覚的に明確になります。さらに、頭に物を置くためにリストが奇妙であるという構文上の優れたリマインダーです。:リストの。

ただし、これを許容できない場合は、おそらく1文字のリスト記号を定義するのが最善の方法です。例えば、

List(1,2,3,4)

は1から4までの数字のリストです。L代わりに入力するだけでよいとしたらどうListでしょうか。これは派手なコンストラクターや静的メソッドではなく、クラスのシングルトンコンパニオンオブジェクトであるため、可能Listであることがわかります。だからあなたはただ

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

そして、あなたは括弧の提案よりも1文字だけ悪いです。

于 2011-05-30T03:22:08.767 に答える
3

定義

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

その後、あなたはすることができます

l(1,2,3)

これは1文字だけ多い[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)

これで、シフト キーに触れることなく、心ゆくまでリストを作成できます。

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" という名前の新しいアイテムを 1 つ追加し、ランダムな説明と次のコードを追加します。

List($END$)

Enter キーを押してエディターに移動し、L キーを押してから Tab キーを押します。それはあなたのタイピングの苦痛の終わりです。配列についても同じことを行います。

于 2013-10-07T02:39:33.620 に答える