Search code examples
scalafoldpass-by-name

How should i understand this definition "final def fold[B](ifEmpty: => B)(f: (A) => B): B"


i knew this question might be dumb.

I just found myself have difficulty understanding the fold definition from Scala Optionlink.

Can anyone help me to understand the definition part? final def fold[B](ifEmpty: => B)(f: (A) => B): B

What does (ifEmpty: => B) mean, does the ifEmpty here represents a function? What does the right part => B represent? Does it represent a function without any parameter? Should that be () => B?


Solution

  • There is quite a lot of going on in definition of

    final def fold[B](ifEmpty: => B)(f: (A) => B): B
    

    We have

    • by-name parameter ifEmpty: => B. This is indeed similar to () => B and means ifEmpty is not evaluated until used (if ever) inside the method body.
    • multiple parameter lists (ifEmpty: => B)(f: (A) => B) which helps type inference because Scala type inference works per list. This means we do not have to explicitly provide [B] type parameter at call-site.
    • type parameters A and B make the method polymorphic
    • final prevents the method from being overriden
    • fold is a higher-order method because it accepts argument of function type (A) => B