diff options
author | awr1 <41453959+awr1@users.noreply.github.com> | 2019-08-07 09:03:32 -0500 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-08-07 16:03:32 +0200 |
commit | 9321b33cd2aa82aded7019d197589e3d8d077963 (patch) | |
tree | 31f89ecfdd450db983f81726ed695d75da968270 /doc | |
parent | afbcd1b330f16294cee32efca1b2f9060874a497 (diff) | |
download | Nim-9321b33cd2aa82aded7019d197589e3d8d077963.tar.gz |
Typeclass/Variant clarification in Manual (#11901)
* [Docs] clarified what type classes do in manual * [Docs] fixed 'dynamism', added to object variant section
Diffstat (limited to 'doc')
-rw-r--r-- | doc/manual.rst | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/doc/manual.rst b/doc/manual.rst index 308412439..61388a9cb 100644 --- a/doc/manual.rst +++ b/doc/manual.rst @@ -1518,8 +1518,10 @@ For a ``ref object`` type ``system.new`` is invoked implicitly. Object variants --------------- -Often an object hierarchy is overkill in certain situations where simple -variant types are needed. +Often an object hierarchy is overkill in certain situations where simple variant +types are needed. Object variants are tagged unions discriminated via a +enumerated type used for runtime type flexibility, mirroring the concepts of +*sum types* and *algebraic data types (ADTs)* as found in other languages. An example: @@ -4406,7 +4408,21 @@ Procedures utilizing type classes in such manner are considered to be `implicitly generic`:idx:. They will be instantiated once for each unique combination of param types used within the program. -Nim also allows for type classes and regular types to be specified +Whilst the syntax of type classes appears to resemble that of ADTs/algebraic data +types in ML-like languages, it should be understood that type classes are static +constraints to be enforced at type instantations. Type classes are not really +types in themsleves, but are instead a system of providing generic "checks" that +ultimately *resolve* to some singular type. Type classes do not allow for +runtime type dynamism, unlike object variants or methods. + +As an example, the following would not compile: + +.. code-block:: nim + type TypeClass = int | string + var foo: TypeClass = 2 # foo's type is resolved to an int here + foo = "this will fail" # error here, because foo is an int + +Nim allows for type classes and regular types to be specified as `type constraints`:idx: of the generic type parameter: .. code-block:: nim |