codesnippets:flexibleinstances
{-# LANGUAGE FlexibleInstances #-}
- 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
TypeSynonymInstances - example:
- code:
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)
- compiler errors:
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 | ^^^^^^^^^^^^^^^^^^^
- example:
- code:
{-# 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)
- compiler errors:
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 | ^^^^^^^^^^^^^^^^^^^
- example, with GHC option:
- code:
{-# 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)
- compiles, error and warning free, with compiler: GHC 8.10.4, using compiler option -Wall
- executes, with output:
[1.3,2.5,3.7] C 3.8
✎
You could leave a comment if you were logged in.
codesnippets/flexibleinstances.txt · Last modified: by 127.0.0.1
