User Tools

Site Tools


codesnippets:flexibleinstances

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:flexibleinstances [2021/04/12 19:12] 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 +  * 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.1618247566.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