scalaz.example
Type members
Classlikes
A Bifunctor is very similar to a Functor, which you are hopefully
already familiar with. Whereas a Functor operates on a * → * and
has a single operation map
which takes a function from A => B to
map a F[A] to a F[B], a Bifunctor operates on a , → * and has a
single operation bimap
which takes two functions: A => C and a
B => D to map a F[A,B] to a F[C,D]:
A Bifunctor is very similar to a Functor, which you are hopefully
already familiar with. Whereas a Functor operates on a * → * and
has a single operation map
which takes a function from A => B to
map a F[A] to a F[B], a Bifunctor operates on a , → * and has a
single operation bimap
which takes two functions: A => C and a
B => D to map a F[A,B] to a F[C,D]:
def bimap[A, B, C, D](fab: F[A, B])(f: A => C, g: B => D): F[C, D]
some examples of common types for which we have Bifunctor instances are Either, Validation, /, Tuple2
A Functor is a ubiquitous typeclass involving type constructors of kind * → *, which is another way of saying types that have a single type variable. Examples might be Option, List, Future.
A Functor is a ubiquitous typeclass involving type constructors of kind * → *, which is another way of saying types that have a single type variable. Examples might be Option, List, Future.
The Functor category involves a single operation, named map
:
def map[A, B](fa: F[A])(f: A => B): F[B]
This method takes a Function from A => B and turns an F[A] into an F[B]
Simple call-by-need (i.e. lazy) interpreter for Lambda Calculus based off of John Launchbury's "A Natural Semantics for Lazy Evaluation" Uses the "Barendregt convention": All variable names are globally unique (i.e. you cannot shadow variable names), and renames variables after substitution to maintain this invariant.
Simple call-by-need (i.e. lazy) interpreter for Lambda Calculus based off of John Launchbury's "A Natural Semantics for Lazy Evaluation" Uses the "Barendregt convention": All variable names are globally unique (i.e. you cannot shadow variable names), and renames variables after substitution to maintain this invariant.
scalaz contains a way to simulate something similar to a Haskell
newtype, where we can take an existing type, and create a new type
from it, and allow us to create new typeclass instances for our
newly created type to get different behaviors. The same thing could
be done with scala 2.10's Value Classes:
https://docs.scala-lang.org/overviews/core/value-classes.html however
one has to be very careful when using value classes, because there
are a lot of instances in which using a value class will incur a
runtime boxing/unboxing of your value, which incurs a runtime
cost. The scalaz tagged types will never cause boxing of a value
that is already AnyRef
.
scalaz contains a way to simulate something similar to a Haskell
newtype, where we can take an existing type, and create a new type
from it, and allow us to create new typeclass instances for our
newly created type to get different behaviors. The same thing could
be done with scala 2.10's Value Classes:
https://docs.scala-lang.org/overviews/core/value-classes.html however
one has to be very careful when using value classes, because there
are a lot of instances in which using a value class will incur a
runtime boxing/unboxing of your value, which incurs a runtime
cost. The scalaz tagged types will never cause boxing of a value
that is already AnyRef
.
Character/Line/Word Count from "The Essence of the Iterator Pattern".
Character/Line/Word Count from "The Essence of the Iterator Pattern".
- See also