fork download
  1. {-# LANGUAGE FlexibleContexts, FlexibleInstances, TypeSynonymInstances #-}
  2.  
  3. weird :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a
  4. weird x g = (x +) * g
  5.  
  6. type DiffInt = Int -> Int
  7.  
  8. instance Enum DiffInt where
  9. toEnum n = (n +)
  10. fromEnum n = n 0
  11.  
  12. instance Num DiffInt where
  13. n + m = n . m
  14. n * m = foldr (+) id $ replicate (fromEnum n) m
  15.  
  16. test :: DiffInt
  17. test = toEnum 3 * toEnum 4
  18.  
  19. test' :: DiffInt
  20. test' = weird 3 (toEnum 4)
  21.  
  22. main = print $ fromEnum test'
Success #stdin #stdout 0s 6224KB
stdin
Standard input is empty
stdout
12