User Tools

Site Tools


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

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
You could leave a comment if you were logged in.
codesnippets/flexibleinstances.txt · Last modified: by 127.0.0.1

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