1

val deck = 1 to 52 toList

// shuffles the deck, and prints it out nicely
deck sortWith ((_, _) => Random.nextBoolean) foreach (x => print(x + " "))

何度もシャッフルしてデッキを印刷するので、次のことをしようとしています


val deck = 1 to 52 toList
def shuffle : (List[Int] => List[Int]) = {_ sortWith ((_, _) => Random.nextBoolean)}
def printDeck : (List[Int] => Unit) = {_ foreach(x => print(x + " "))}

deck shuffle printDeck // this doesnt work

// I can only do 
printDeck(shuffle(deck)) // this works

括弧を使用する必要がない場合、パラメーターの左側で関数を呼び出す方がはるかにエレガントです。

4

2 に答える 2

5

構文を取得するobject functionには、関数をクラスのメソッドとして持つ必要があります。

これは、暗黙の定義で実現できます。

implicit def enhanceDeck(deck: List[Int]) = new {
  def shuffle = 
    deck sortWith ((_, _) => Random.nextBoolean)

  def printDeck = 
    deck.foreach(x => print(x + " "))
}

これで、次のことができます。

val deck = 1 to 52 toList
deck shuffle 
deck printDeck

しかし、Scala はあなた. 代わりに、次のいずれかを使用します。deck shuffle printDeckdeck.shuffle(printDeck)

deck.shuffle.printDeck
deck.shuffle printDeck

編集:あなたの最初のスニペットは実際にはobject function arg function arg. 両方ともsortWithforeach1 つの引数を取ります。

の型を定義するDeckことはおそらくきれいにするための良いアプローチですが、Deck(deck) shuffle printDeckScala がDeck(deck).shuffle(printDeck).

次のようになります。

case class Deck(deck: List[Int]) {
  def shuffle = 
    deck sortWith ((_, _) => Random.nextBoolean)

  def printDeck = 
    deck.foreach(x => print(x + " "))
}

Deck(deck).shuffle printDeck
于 2012-04-15T17:06:19.483 に答える
4

本当に持ちたいなら

deck <?> shuffle <?> printDeck

それ以外の

printDeck(shuffle(deck))

|>演算子 ( scalazで定義するか、独自に作成する) の使用を検討する必要があります。

deck |> shuffle |> printDeck

一般に、Scala でforward パイプを使用することに反対する有効なポイントがあるかもしれませんが、本当に単に順序を逆にしたい場合は、特定の pimp をList[Int].

定義 (参考用です。これを実装として使用しないでください):

implicit def toForwardPipe[T](x : T) = new {
  def |> [U](f : T => U) = f(x)
}
于 2012-04-15T17:31:46.193 に答える