User Tools

Site Tools


codesnippets:flexibleinstances

Differences

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

Link to this comparison view

Next revision
Previous revision
codesnippets:flexibleinstances [2021/04/12 18:33] – created f2b216codesnippets:flexibleinstances [2025/10/08 00:48] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== {-# LANGUAGE FlexibleInstances #-} ====== ====== {-# LANGUAGE FlexibleInstances #-} ======
 +~~DISCUSSION~~
  
 +  * allows to implement instances that are of form (T a1 ... an) where a1 ... an are particlar types (not type variables)
 +    * [Double] instead of [a]
 +  * implies the application of extension ''[[codesnippets:typesynonyminstances|TypeSynonymInstances]]'' 
 +  * example:
 +    * code:<code Haskell>
 +main :: IO ()
 +main = 
 +    do
 +        print x1
 +        print x2
 +
 +class MyClass x where
 +    fMy :: x -> x -> x
 +
 +type MySpeed = Double
 +
 +instance MyClass [MySpeed] where
 +    fMy xA xB = xA ++ xB
 +
 +data MyData a = C a
 +    deriving Show
 +
 +type MySpeedData = (MyData MySpeed)
 +
 +instance MyClass MySpeedData where
 +    fMy (C xA) (C xB) = C (xA + xB)
 +
 +x1 :: [MySpeed]
 +x1 = fMy [1.3] [2.5, 3.7]
 +
 +x2 :: MySpeedData
 +x2 = fMy (C 1.3) (C 2.5)
 +</code>
 +    * compiler errors:<code>
 +app\Main.hs:12:10: error:
 +    * Illegal instance declaration for `MyClass [MySpeed]'
 +        (All instance types must be of the form (T a1 ... an)
 +         where a1 ... an are *distinct type variables*,
 +         and each type variable appears at most once in the instance head.
 +         Use FlexibleInstances if you want to disable this.)
 +    * In the instance declaration for `MyClass [MySpeed]'
 +   |
 +12 | instance MyClass [MySpeed] where
 +            ^^^^^^^^^^^^^^^^^
 +
 +app\Main.hs:20:10: error:
 +    * Illegal instance declaration for `MyClass MySpeedData'
 +        (All instance types must be of the form (T t1 ... tn)
 +         where T is not a synonym.
 +         Use TypeSynonymInstances if you want to disable this.)
 +    * In the instance declaration for `MyClass MySpeedData'
 +   |
 +20 | instance MyClass MySpeedData where
 +            ^^^^^^^^^^^^^^^^^^^
 +</code>
 +  * example:
 +    * code:<code Haskell>
 +{-# LANGUAGE TypeSynonymInstances #-}
 +
 +main :: IO ()
 +main = 
 +    do
 +        print x1
 +        print x2
 +
 +class MyClass x where
 +    fMy :: x -> x -> x
 +
 +type MySpeed = Double
 +
 +instance MyClass [MySpeed] where
 +    fMy xA xB = xA ++ xB
 +
 +data MyData a = C a
 +    deriving Show
 +
 +type MySpeedData = (MyData MySpeed)
 +
 +instance MyClass MySpeedData where
 +    fMy (C xA) (C xB) = C (xA + xB)
 +
 +x1 :: [MySpeed]
 +x1 = fMy [1.3] [2.5, 3.7]
 +
 +x2 :: MySpeedData
 +x2 = fMy (C 1.3) (C 2.5)
 +</code>
 +    * compiler errors:<code>
 +app\Main.hs:14:10: error:
 +    * Illegal instance declaration for `MyClass [MySpeed]'
 +        (All instance types must be of the form (T a1 ... an)
 +         where a1 ... an are *distinct type variables*,
 +         and each type variable appears at most once in the instance head.
 +         Use FlexibleInstances if you want to disable this.)
 +    * In the instance declaration for `MyClass [MySpeed]'
 +   |
 +14 | instance MyClass [MySpeed] where
 +            ^^^^^^^^^^^^^^^^^
 +
 +app\Main.hs:22:10: error:
 +    * Illegal instance declaration for `MyClass MySpeedData'
 +        (All instance types must be of the form (T a1 ... an)
 +         where a1 ... an are *distinct type variables*,
 +         and each type variable appears at most once in the instance head.
 +         Use FlexibleInstances if you want to disable this.)
 +    * In the instance declaration for `MyClass MySpeedData'
 +   |
 +22 | instance MyClass MySpeedData where
 +            ^^^^^^^^^^^^^^^^^^^
 +</code>
 +  * example, with GHC option:
 +    * code:<code Haskell>
 +{-# LANGUAGE FlexibleInstances #-}
 +
 +main :: IO ()
 +main = 
 +    do
 +        print x1
 +        print x2
 +
 +class MyClass x where
 +    fMy :: x -> x -> x
 +
 +type MySpeed = Double
 +
 +instance MyClass [MySpeed] where
 +    fMy xA xB = xA ++ xB
 +
 +data MyData a = C a
 +    deriving Show
 +
 +type MySpeedData = (MyData MySpeed)
 +
 +instance MyClass MySpeedData where
 +    fMy (C xA) (C xB) = C (xA + xB)
 +
 +x1 :: [MySpeed]
 +x1 = fMy [1.3] [2.5, 3.7]
 +
 +x2 :: MySpeedData
 +x2 = fMy (C 1.3) (C 2.5)
 +</code>
 +    * compiles, error and warning free, with compiler: GHC 8.10.4, using compiler option -Wall
 +    * executes, with output:<code>
 +[1.3,2.5,3.7]
 +C 3.8
 +</code>
 +
 +
 +===== ✎ =====
 +~~DISCUSSION~~
codesnippets/flexibleinstances.1618245184.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