= Algebra of Sets = The concept of a ''class'' or a ''set of objects'' (a collection) is defined by any property or attribute which each object considered must either possess or not posses; those objects which posses the property form a corresponding set (belong to a corresponding class). The fundamental property of {{{Set}}}s is that they have an ''order relation'' which defines a ''set - subset'' relationship. Which means {{{Set}}}s ''may (or may not)'' be [wiki:/FirstPrinciples/Nesting nested]. Formally, the set {{{A}}} is said to be the ''subset'' of the set {{{B}}} if there is no object in {{{A}}} that is not ''also'' in {{{B}}}. Which means {{{A}}} is [wiki:/FirstPrinciples/Nesting nested] (contained) in {{{B}}}. Each {{{set}}} therefore is ''self-contained'' (or, like a {{{Number}}}, equal to itself). Equality for {{{Set}}}s is defined as ''every element of {{{A}}} must be also an element of {{{B}}} and conversely'', which ''implies'' the same size. This is ''per-element'' equality ('''not''' a ''structural equality'', since {{{Set}}}s have no notion of structure, only of ''membership''). This is similar to {{{less-or-equal}}} relation, which is defined as ''the difference is {{{0}}}'' (there is ''no difference'') for {{{equality}}} and a ''positive difference'' (the result of subtraction) for {{{less-than}}} relation. However, {{{Set}}}s does not have ''complete ordering'', like {{{Number}}}s, since any two sets {{{A}}} and {{{B}}} could be ''completely unrelated'' (having nothing in common - {{{()}}} as their ''logical product'') or ''partially'' related (having non-empty ''intersection'' (a set of ''common elements''). * {{{A + A = A}}} - logical sum or ''union'' * {{{A * A = A}}} - logical product or ''intersection'' If {{{A}}} is a ''subset'' of {{{B}}} then {{{(A + B) = B}}} {{{Set}}}s are ''fundamental abstract containers'' (a ''generalized and abstracted out pattern'' of [wiki:/WhatIs What Is]) or ''abstract classes'' so, they have ''laws'' similar to {{{Natural Number}}}s (another ''generalized and abstracted out pattern'' - another fundamental abstraction). This equation {{{#!sml A(B+C) = AB + AC }}} which reads The set consisting of objects which are in {{{A}}} ''and also'' in ''either'' {{{B}}} ''or'' {{{C}}} is the same as the set consisting of those objects which are ''either in'' '''both''' {{{A}}} and {{{B}}} ''or'' in ''both'' {{{A}}} and {{{C}}}, is example of an algebraic law. There are more that 20 of these laws. * Sum is ''union'' of ''either'' A ''or'' B (that is why ''the whole'' it is called a ''sum'') * Product is ''intersection of ''both'' A ''and'' B (so it is called a ''product'' of the two) {{{()}}} is {{{0}}} or nothing or {{{False}}} {{{I}}} is {{{1}}} or the whole or {{{True}}} {{{A'}}} is a complement (''inverse'') - logical {{{NOT}}}) so {{{()' = I}}} {{{I' = ()}}} * {{{AA' = ()}}} - nothing can be ''both'' {{{A}}} ''and'' {{{NOT A}}} - ''the law of contradiction'' * {{{A + A' = I}}} - ''either'' in this or in that - ''the law of excluded middle'' === Syllogism === {{{A ⊃ B}}} and {{{B ⊃ C}}} then {{{A ⊃ C}}}. If all {{{B}}}s are {{{A}}}s and all {{{C}}}s are {{{B}}}s then {{{C}}}s are {{{A}}}s. Which is the basis of ''classification'' ({{{class-subclass}}} relationships ({{{is-a}}} relationship). == Types are sets == === Algebraic Data Types === [wiki:/FirstPrinciples/AlgebraicDataTypes Algebraic Data Types] are a straightforward specialization of sets into so called ''Sum Types'' ({{{True | False}}}) and ''Product Types'' ({{{Data.Tuple}}}). === Collections === Collections, such as {{{List}}}s, which are [wiki:/BigIdeas/AbstractDataTypes ADTs] are specialized sets defined by name and [wiki:/BigIdeas/Interfaces interface] to implement. Good collections, like {{{List}}}s must have a ''closure'' property ("the empty list" ''is a'' {{{List}}}). === Type Classes === In [wiki:/Languages/Haskell Haskell] [wiki:/BigIdeas/TypeClasses Type-Classes] are specialized sets coupled with [wiki:/BigIdeas/Protocols protocols] to implement, which are defined as a ''templates'', to be instantiated with "concrete" types (like {{{[Char]}}}). === Classes === Classes are templates for a [wiki:/BigIdeas/Structures structured] values (usually called ''objects'') which combine ''data slots'' and ''code slots'' - closures (usually called methods). Classes might have a straightforward {{{set - subset}}} hierarchy, which is basis for inheritance (the way to structure the code for ''reuse''). === Traits or Behaviors === The {{{set - subset}}} relationship could not be established for sets like {{{{1,2,3}}}} and {{{{2,3,4}}}}. ''Neither is a subset of either''. This is what Traits are all about - ''partial'' relations. Traits (or Mixins) are ''composable implementations of protocols or interfaces'' (behaviors) which could be substituted in the ''equivalent-for-equivalent'' basis. No wonder, languages with Traits are more flexible (more suitable for modeling aspects of reality) than languages with only {{{class - subclass}}} relationships (your fucking Java).