People usually say a type IS a monad.
In some functional languages and libraries (like Scala/Scalaz), you have a type constructor like List or Option, and you can define a Monad implementation that is separated from the original type. So basically there's nothing that forbids you in the type system from creating distinct instances of Monad for the same type constructor.
monad, (from Greek monas “unit”), an elementary individual substance that reflects the order of the world and from which material properties are derived. The term was first used by the Pythagoreans as the name of the beginning number of a series, from which all following numbers derived.
Monads are simply a way to wrapping things and provide methods to do operations on the wrapped stuff without unwrapping it. For example, you can create a type to wrap another one, in Haskell: data Wrapped a = Wrap a. To wrap stuff we define return :: a -> Wrapped a return x = Wrap x.
A monad is an algebraic structure in category theory, and in Haskell it is used to describe computations as sequences of steps, and to handle side effects such as state and IO. Monads are abstract, and they have many useful concrete instances. Monads provide a way to structure a program.
So in simple words, a monad is a rule to pass from any type X to another type T(X) , and a rule to pass from two functions f:X->T(Y) and g:Y->T(Z) (that you would like to compose but can't) to a new function h:X->T(Z) .
You can commonly find this all around in mathematics.
A monad is a triple (T, return, bind)
such that (...). When bind
and return
can be inferred from the context, we just refer to the monad as T
.
A monoid is a triple (M, e, •)
such that (...). (...) we just refer to the monoid as M
.
A topological space is a pair (S, T)
such that (...). We just refer to the topological space as S
.
A ring is a tuple (V, 0, +, 1, ×)
...
So indeed, for a given type constructor T
there may be multiple different definitions of return
and bind
that make a monad. To avoid having to refer to the triple every time, we can give T
different names to disambiguate, in a way which corresponds to the newtype
construct in Haskell. For example: []
vs ZipList
, State s
vs ReaderT s (Writer s)
.
P.S. There is something artificial in saying that a monad or a monoid is a triple, especially given that there are different presentations: we could also say that a monad is a triple (T, fmap, join)
, or that a monoid is a pair (M, •)
, with the identity element hidden in the extra condition (because it is uniquely determined by •
anyway). The ontology of mathematical structures is a more philosophical question that is outside the scope of SO (as well as outside my expertise). But a more prudent way to reformulate such definitions may be to say that "a monad is (defined|characterized) by a triple (T, return, bind)
".
Insofar as you're asking about language usage, Google says that the phrase “has a monad” doesn't seem to be commonly used in the way you're asking about. Most real occurrences are in sentences such as, “The Haskell community has a monad problem.” However, a few cases of vaguely similar usage do exist in the wild, such as, “the only thing which makes it ‘monadic‘ is that it has a Monad
instance.” That is, monad is often used as a synonym for monadic, modifying some other noun to produce a phrase (a monad problem, a Monad
instance) that is sometimes used as the object of the verb have.
As for coding: in Haskell, a type can declare one instance
of Monad
, one of Monoid
and so on. When a given type could have many such instances defined, such as how numbers are monoids under addition, multiplication, maximum, minimum and many other operations, Haskell defines separate types, such as Sum Int
, a Monoid
instance over Int
where the operation is +
, and Product Int
, a Monoid
instance where the operation is *
.
I haven't comprehensively checked the tens of thousands of hits, though, so it's very possible there are better examples in there of what you're asking about.
The phrasing I've commonly seen for that is the one I just used: a type is a category under an operation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With