--- /dev/null
+class NewFunctor f where
+ inj :: a -> f a
+ surj :: f a -> a
+
+data N a = Z a
+
+ninj x = (Z x)
+nsurj (Z x) = x
+
+instance NewFunctor N where
+ inj = ninj
+ surj = nsurj
+
+twice :: NewFunctor f => a -> f (f a)
+twice x = inj(inj x)
+
+undo :: NewFunctor f => f (f a) -> a
+undo x = surj(surj x)
+
+main = putStr (undo (Z (Z "hello world\n")))