All implicit syntax in BIO is available automatically without wildcard imports with the help of so-called "implicit punning", as in the following example:
import izumi.functional.bio.Monad2
def loop[F[+_, +_]: Monad2]: F[Nothing, Nothing] = {
val unitEffect: F[Nothing, Unit] = Monad2[F].unit
unitEffect.flatMap(loop)
}
Note that a .flatMap method is available on the unitEffect value of an abstract type parameter F, even though we did not import any syntax implicits using a wildcard import.
The flatMap method was added by the implicit punning on the Monad2 name. In short, implicit punning just means that instead of creating a companion object for a type with the same name as the type, we create "companion" implicit conversions with the same name. So that whenever you import the type, you are also always importing the syntax-providing implicit conversions.
This happens to be a great fit for Tagless Final Style, since nearly all TF code will import the names of the used typeclasses.
Implicit Punning for typeclass syntax relieves the programmer from having to manually import syntax implicits in every file in their codebase.
Attributes
- Note
-
The order of conversions is such to allow otherwise conflicting type classes to not conflict, e.g. code using constraints such as
def x[F[+_, +_]: Functor2: Applicative2: Monad2]will compile and run normally when using syntax, despite ambiguity of implicits caused by all 3 implicits inheriting from Functor2. This is because, due to the priority order being from most-specific to least-specific, theMonad2syntax will be used in such a case, where theMonad2[F]implicit is actually unambiguous. - Companion
- object
- Graph
-
- Supertypes
-
trait ImplicitPunstrait ImplicitPunsTemporaltrait ImplicitPunsWeakTemporaltrait ImplicitPunsForktrait ImplicitPunsAsynctrait ImplicitPunsWeakAsynctrait ImplicitPunsConcurrenttrait ImplicitPunsParalleltrait ImplicitPunsIOtrait ImplicitPunsPanictrait ImplicitPunsBrackettrait ImplicitPunsErrortrait ImplicitPunsGuaranteetrait ImplicitPunsMonadtrait ImplicitPunsApplicativetrait ImplicitPunsBifunctortrait ImplicitPunsFunctorclass Objecttrait Matchableclass AnyShow all
Members list
Value members
Concrete methods
A convenient dependent-typed summoner for BIO hierarchy. Auto-narrows to the most powerful available type class:
A convenient dependent-typed summoner for BIO hierarchy. Auto-narrows to the most powerful available type class:
import izumi.functional.bio.{F, Temporal2}
def y[F[+_, +_]: Temporal2] = {
F.timeout(5.seconds)(F.forever(F.unit))
}
Attributes
Inherited methods
Attributes
- Inherited from:
- ImplicitPunsApplicative
Attributes
- Inherited from:
- ImplicitPunsApplicativeError
Attributes
- Inherited from:
- ImplicitPunsAsync
Attributes
- Inherited from:
- ImplicitPunsBifunctor
Attributes
- Inherited from:
- ImplicitPunsBracket
Attributes
- Inherited from:
- ImplicitPunsConcurrent
Attributes
- Inherited from:
- ImplicitPunsError
Attributes
- Inherited from:
- ImplicitPunsFork
Attributes
- Inherited from:
- ImplicitPunsFunctor
Attributes
- Inherited from:
- ImplicitPunsGuarantee
Attributes
- Inherited from:
- ImplicitPunsIO
Shorthand for IO2#syncThrowable
Shorthand for IO2#syncThrowable
IO2(println("Hello world!"))
Attributes
- Inherited from:
- ImplicitPunsIO
Attributes
- Inherited from:
- ImplicitPunsMonad
Attributes
- Inherited from:
- ImplicitPunsPanic
Attributes
- Inherited from:
- ImplicitPunsParallel
Attributes
- Inherited from:
- ImplicitPunsParallelErrorAccumulatingOps
Attributes
- Inherited from:
- ImplicitPunsTemporal
Attributes
- Inherited from:
- ImplicitPunsWeakAsync
Attributes
- Inherited from:
- ImplicitPunsWeakTemporal
Implicits
Inherited implicits
Attributes
- Inherited from:
- ImplicitPunsApplicative
Attributes
- Inherited from:
- ImplicitPunsApplicativeError
Attributes
- Inherited from:
- ImplicitPunsAsync
Attributes
- Inherited from:
- ImplicitPunsBifunctor
Attributes
- Inherited from:
- ImplicitPunsBifunctor
Attributes
- Inherited from:
- ImplicitPunsBracket
Attributes
- Inherited from:
- ImplicitPunsConcurrent
Attributes
- Inherited from:
- ImplicitPunsConcurrent
Attributes
- Inherited from:
- ImplicitPunsError
Attributes
- Inherited from:
- ImplicitPunsFork
Attributes
- Inherited from:
- ImplicitPunsFunctor
Attributes
- Inherited from:
- ImplicitPunsGuarantee
Attributes
- Inherited from:
- ImplicitPunsIO
Attributes
- Inherited from:
- ImplicitPunsMonad
Attributes
- Inherited from:
- ImplicitPunsPanic
Attributes
- Inherited from:
- ImplicitPunsParallel
Attributes
- Inherited from:
- ImplicitPunsParallel
Attributes
- Inherited from:
- ImplicitPunsParallelErrorAccumulatingOps
Attributes
- Inherited from:
- ImplicitPunsParallelErrorAccumulatingOps
Attributes
- Inherited from:
- ImplicitPunsTemporal
Attributes
- Inherited from:
- ImplicitPunsTemporal
Attributes
- Inherited from:
- ImplicitPunsWeakAsync
Attributes
- Inherited from:
- ImplicitPunsWeakTemporal
Attributes
- Inherited from:
- ImplicitPunsWeakTemporal