lllllllllllll
lllllllllllll

Reputation: 9130

Scalaz pipe operator connected with a list method

I am a newbie to Scala, but I have some experience in using OCaml. I am thinking to adopt the pipe operator defined in Scalaz in the following way:

import scalaz._
import Scalaz._

def test = {
  def length2(x:String) = List(x.length * 2)
  "asdasd" |> length2
}

The above code works fine. However, when I want to bridge another function to get the length of the list, it throws an compilation error:

def test = {
  def length2(x:String) = List(x.length * 2)
  "asdasd" |> length2
  .length    <======== I cannot do this...
}

Besides, can I put the |> operator in another line? like this?

def test = {
  def length2(x:String) = List(x.length * 2)
  "asdasd" 
  |> length2          <====== I cannot do this... 
}

Currently, I have no idea how to do the above two things in Scala. I am really sorry if this question is too naive.. But could anyone tell me whether it is feasible in Scala? Thank you!

Upvotes: 2

Views: 691

Answers (2)

Seth Tisue
Seth Tisue

Reputation: 30498

Since Scala 2.13, a pipe method is provided by the Scala standard library:

scala 2.13.3> import scala.util.chaining._

scala 2.13.3> "asdf".pipe(length2).pipe(_.length)
val res2: Int = 1

To use the same method in Scala 2.11 or 2.12, add scala-collection-compat as a dependency.

Upvotes: 0

liljerk
liljerk

Reputation: 91

You need to pass the "thrush" combinator a function, so the following works:

"asdf" |> length2 |> (_.length)

If you want to insert line breaks, put the operator at the end of the line:

"asdf" |>
length2 |>
(_.length)

or the following is also valid:

"asdf"
.|> (length2)
.|> (_.length)

Upvotes: 2

Related Questions