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

但是你不能这样做deck shuffle printDeck,因为 Scala 认为你在做deck.shuffle(printDeck). 相反,请使用以下之一:

deck.shuffle.printDeck
deck.shuffle printDeck

编辑:您的第一个片段实际上是object function arg function arg. 两者sortWithforeach采取一个论点。

定义一个类型 forDeck可能是一个很好的清洁方法,但仍然不允许你使用你想要的语法,因为你只会有类似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 中使用正向管道可能有一些合理的观点,但如果你真的只是想颠倒顺序,那么使用这个通用运算符比创建特定的 pimp 到List[Int].

定义(仅供参考,请勿以此作为实现):

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