Without a type signature, all GHCI knows:
Prelude> :t read "2"
read "2" :: Read a => a
is that it should return some kind of Read -- that is, something that can be from a string. GHCI is not being asked to return any (concrete) type.
If you specify a type -- and if that type can be expressed as a string containing a single digit -- then it works:
Prelude> read "2" :: Float
2.0
And otherwise it won't:
Prelude> read "2" :: [Float]
*** Exception: Prelude.read: no parse
You don't necessarily have to provide a type signature, though, if it can be inferred from context:
Prelude> floor $ read "2"
2
Prelude> :t floor
floor :: (Integral b, RealFrac a) => a -> b
Prelude> :t floor $ read "2"
floor $ read "2" :: Integral b => b
Note that GHCI in this case still does not know exactly the type of (floor $ read "2"), but thanks to the type of floor, it knows enough to proceed.