summary refs log tree commit diff stats
path: root/doc
diff options
context:
space:
mode:
authorawr1 <41453959+awr1@users.noreply.github.com>2019-08-07 09:03:32 -0500
committerAndreas Rumpf <rumpf_a@web.de>2019-08-07 16:03:32 +0200
commit9321b33cd2aa82aded7019d197589e3d8d077963 (patch)
tree31f89ecfdd450db983f81726ed695d75da968270 /doc
parentafbcd1b330f16294cee32efca1b2f9060874a497 (diff)
downloadNim-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.rst22
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