Obviously, the following function is impossible, because it is impossible to unwrap an IO value permanently (ignoring unsafePerformIO or similar):
unwrapIO :: IO String -> String unwrapIO (IO str) = str However, similar functions such as the following are possible:
unwrapJust :: Maybe String -> String unwrapJust (Just str) = str unwrapJust Nothing = "ignore this plz" I fully understand the reasoning behind why #2 is possible but #1 is not, but I do not understand how. Can I also make my own types that are not unwrappable?
IOis a primitive and has no constructors, so cannot be unwrapped.