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
当您不必使用括号时,调用参数左侧的函数会更加优雅。
答案 0 :(得分: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
。 sortWith
和foreach
都有一个参数。
为Deck
定义一个类型可能是一个很好的清洁方法,但仍然不允许你使用你想要的语法,因为你只需要像Scala所假设的那样Deck(deck) shuffle printDeck
是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
答案 1 :(得分:4)
如果你真的想拥有
deck <?> shuffle <?> printDeck
而不是
printDeck(shuffle(deck))
您应该考虑使用|>
运算符(在scalaz中定义,或者只是创建自己的运算符)因为这对它有用
deck |> shuffle |> printDeck
虽然在Scala中使用正向管道可能存在一些有效的观点,但如果你真的只想颠倒这个顺序,那么这个通用运算符会比创建特定的pimps更加清晰。到List[Int]
。
定义(仅供参考;请不要将其用作实现):
implicit def toForwardPipe[T](x : T) = new {
def |> [U](f : T => U) = f(x)
}