|> in Scala

F# の |> を Scala でやってみた。

scala> class Holder[A](a:A) {
     |   def |>[B](f:A => B) = f(a)
     | }
defined class Holder

scala> implicit def any2holder[A](a:A) = new Holder(a)
any2holder: [A](a: A)Holder[A]

scala> val succ = (x:Int) => x + 1
succ: (Int) => Int = <function1>

scala> 3 |> succ |> succ
res0: Int = 5

scala> 3 |> { (x:Int) => x * 2 } |> succ
res1: Int = 7


お、これは・・・

scala> 3 |> {
     |   case x => x * 2
     | }
res2: Int = 6

scala> 3 match {
     |   case x => x * 2
     | }
res3: Int = 6

おお!match と同じように使える!

  • 追記
scala> class Holder[A](a:A) {
     |   def |>[B](f:A=>B) = f(a)
     |   def <|:[B](f:A=>B) = f(a)
     | }
defined class Holder

scala> implicit def any2holder[A](a:A) = new Holder(a)
any2holder: [A](a: A)Holder[A]

scala> val succ = (x:Int) => x + 1
succ: (Int) => Int = <function1>

scala> succ <|: succ <|: 10
res0: Int = 12


scala> val tw = (x:Int) => x * 2
tw: (Int) => Int = <function1>

scala> succ <|: succ <|: 10 |> tw |> tw
res1: Int = 48

scala> tw <|: tw <|: 10 |> succ |> succ
res2: Int = 42

おー!