Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.62 KB | None | 0 0
  1. {-# LANGUAGE FlexibleContexts, KindSignatures, TypeFamilies #-}
  2. import Data.Proxy
  3.  
  4. class IsFun a where
  5. isFunProxy :: (Proxy a) -> Bool
  6.  
  7. data Fun
  8.  
  9. data NotFun
  10.  
  11. instance IsFun Fun where
  12. isFunProxy _ = True
  13.  
  14. instance IsFun NotFun where
  15. isFunProxy _ = False
  16.  
  17. type family IsFun' (a :: *) where
  18. IsFun' (a -> b) = Fun
  19. IsFun' a = NotFun
  20.  
  21. proxy :: a -> Proxy (IsFun' a)
  22. proxy _ = Proxy
  23.  
  24. isFun :: (IsFun (IsFun' a)) => a -> Bool
  25. isFun a = isFunProxy $ proxy a
  26.  
  27. f1 :: Int -> Int
  28. f1 = id
  29.  
  30. f2 :: Int -> Int -> Int
  31. f2 = const
  32.  
  33. v :: Int
  34. v = 0
  35.  
  36. main = do
  37. print $ isFun f1
  38. print $ isFun f2
  39. print $ isFun v
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement