User Tools

Site Tools


codesnippets:typeclasses

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
codesnippets:typeclasses [2021/04/10 17:09] f2b216codesnippets:typeclasses [2025/10/08 00:48] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Type classes and its instances, and the deriving mechanism ====== ====== Type classes and its instances, and the deriving mechanism ======
-~~DISCUSSION~~ 
  
   * A type class (keyword: ''class'') is a set of functions declarations that    * A type class (keyword: ''class'') is a set of functions declarations that 
Line 6: Line 5:
     * have instances (keyword: ''instance'') with type specific bindings.     * have instances (keyword: ''instance'') with type specific bindings.
   * module ''Prelude'' already consists of many type classes   * module ''Prelude'' already consists of many type classes
-    * {{:codesnippets:preludetypeclasses.png?400|Type classes in Prelude}}+    * {{:modules:preludetypeclasses.png?direct&300|}} 
 +      * picture from: Dirk Hünniger 
 +      * source: [[https://commons.wikimedia.org/wiki/File:HaskellClasses.svg]]
       * type ''class''es are in bold       * type ''class''es are in bold
       * below all types that have implemented instances       * below all types that have implemented instances
Line 14: Line 15:
         *'' Float''         *'' Float''
         * ''Double''         * ''Double''
 +  * additionally, there is many other libraries available with important type classes
 +    * {{:codesnippets:typeclassopedia-diagram.png?direct&700|}}
 +      * source: [[https://wiki.haskell.org/Typeclassopedia]]
   * example, implementing an ''Enum'' type class, and an instance for a data type   * example, implementing an ''Enum'' type class, and an instance for a data type
     * functions ''succ'', and ''pred'' have default implementations in ''class  Enum'',      * functions ''succ'', and ''pred'' have default implementations in ''class  Enum'', 
Line 75: Line 79:
 C3 C3
 </code> </code>
-  * example, implementing a ''Functor'':<code Haskell>+  * example, implementing an ''instance'' of the ''Prelude'' class ''Show'' for a data type 
 +    * function ''show'' is implemented again for ''MyInt'' 
 +    * code:<code Haskell> 
 +main :: IO () 
 +main = putStrLn (show x1) 
 + 
 +data MyInt = C0 | C1 | C2 | C3 
 + 
 +instance Show MyInt where 
 +    show C0 = "C0" 
 +    show C1 = "C1" 
 +    show C2 = "C2" 
 +    show C3 = "C3" 
 + 
 +x1 = C3 
 +</code> 
 +    * executes, again with output:<code> 
 +C3 
 +</code> 
 + 
 +===== Deriving mechanism ===== 
 + 
 +Looking to the examples above you may wonder, whether there an easier way to implement an ''instance'' of standard type classes. Yes, there is the ''deriving'' mechanism. 
 + 
 +  * example, where a data type applies ''deriving'' mechanism 
 +    * to implement all function of typeclass ''Show'', and ''Enum'' 
 +    * code:<code Haskell> 
 +main :: IO () 
 +main = putStrLn (show x1) 
 + 
 +data MyInt = C0 | C1 | C2 | C3 
 +    deriving (Show, Enum) 
 + 
 +x1 = succ C1 
 +</code> 
 +    * executes, again with output:<code> 
 +C2 
 +</code> 
 + 
 +===== Advanced type classes ===== 
 + 
 +  * example, implementing a ''Functor'' 
 +    * code:<code Haskell>
 import Prelude hiding (Maybe(..), Functor(..)) import Prelude hiding (Maybe(..), Functor(..))
  
Line 99: Line 145:
 </code> </code>
  
 +
 +===== ✎ =====
 +~~DISCUSSION~~
codesnippets/typeclasses.1618067365.txt.gz · Last modified: (external edit)

Except where otherwise noted, content on this wiki is licensed under the following license: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki