You need to read up more on how Haskell IO works and make sure you understand it.
A couple of points on your example. If you want to use read to deserialize to SomeData, you need to provide a Read instance for the type. You can use the default one:
data SomeData = SomeData Int Int deriving (Read)
Second: getLine is an IO action that returns a String, not a String; since read wants a String, this is the cause of your error. This is closer to what you want:
getDataFromUser :: IO SomeData
getDataFromUser = do str <- getLine
return (read str)
This can be simplified to the following, but make sure you understand the above example before you worry too much about this:
getDataFromUser :: IO SomeData
getDataFromUser = liftM read getLine
getDataFromUser :: IO SomeData; getDataFromUser = readLn.