Scala定义一个函数并在参数的左侧调用它

nob*_*ody 1 functional-programming scala


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

当您不必使用括号时,调用参数左侧的函数会更加优雅.

dhg*_*dhg 5

为了获得object function语法,您必须将该函数作为类的方法.

您可以使用隐式定义来完成此操作:

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

  def printDeck = 
    deck.foreach(x => print(x + " "))
}
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

val deck = 1 to 52 toList
deck shuffle 
deck printDeck
Run Code Online (Sandbox Code Playgroud)

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

deck.shuffle.printDeck
deck.shuffle printDeck
Run Code Online (Sandbox Code Playgroud)

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

定义一个类型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
Run Code Online (Sandbox Code Playgroud)