rw.hs:14:47: Couldn't match expected type ‛a’ with actual type ‛Int’ ‛a’ is a rigid type variable bound by the type signature for writeInt :: T a -> IORef a -> IO () at rw.hs:12:12 Relevant bindings include ref :: IORef a (bound at rw.hs:13:12) v :: T a (bound at rw.hs:13:10) writeInt :: T a -> IORef a -> IO () (bound at rw.hs:13:1) In the second argument of ‛writeIORef’, namely ‛(1 :: Int)’ In the expression: writeIORef ref (1 :: Int) In a case alternative: ~(Li x) -> writeIORef ref (1 :: Int) rw.hs:19:51: Couldn't match type ‛a’ with ‛Bool’ ‛a’ is a rigid type variable bound by the type signature for readBool :: T a -> IORef a -> IO () at rw.hs:16:12 Expected type: a -> Bool Actual type: Bool -> Bool Relevant bindings include ref :: IORef a (bound at rw.hs:17:12) v :: T a (bound at rw.hs:17:10) readBool :: T a -> IORef a -> IO () (bound at rw.hs:17:1) In the second argument of ‛(.)’, namely ‛not’ In the second argument of ‛(>>=)’, namely ‛(print . not)’