Parsing 2D matrix: "[[1,2][3,4]]"
Many improvements are possible. 

First, you shouldn't use ReadS and other rudumentary Prelude parsing function for anything but exercises. Use parsing libraries from Hackage instead. parsec is a good library to start with, if you are not sure of which one to use.

Second, if it is an exersise, you can avoid long chains of Nothing matches by using Maybe monad. I reimplemented read2Vec2 for example:

read2Vec2 :: String -&gt; Maybe (((Integer, Integer),(Integer,Integer)), String)
read2Vec2 s = do
    ((a,b), r1) &lt;- readVec2 s
    ((c,d), r2) &lt;- readVec2 r1
    Just (((a,b),(c,d)), r2) 


Third, you can avoid passing unparsed input around by keeping it in the State monad. At this point our code will do what parsec does :) except parsec does it better.

If you want to stay with your current approach then readBrackets can be shortened:

readBrackets :: ReadS a -&gt; ReadS a
readBrackets g r = do
    ("[", s) &lt;- lex r
    (x,t)    &lt;- g s
    ("]", u) &lt;- lex t
    return (x,u)


Here is full parser using parsec:

{-# LANGUAGE NoMonomorphismRestriction #-}
import Text.ParserCombinators.Parsec
import Control.Applicative

data Mat2x2 = MkMat2x2 Integer Integer Integer Integer
  deriving (Show, Eq)

parseMat2x2 = parse mat2x2 "(unknown)" 

nat = read &lt;$&gt; many1 digit 

mat2x2 = do
    string "[["
    d1 &lt;- nat
    char ','
    d2 &lt;- nat
    string "]["
    d3 &lt;- nat
    char ','
    d4 &lt;- nat
    string "]]"
    return $ MkMat2x2 d1 d2 d3 d4

main = print $ parseMat2x2 "[[2,2][3,4]]"


The parser can be made less strict if necessary. For example, current parser doesn't accept any whitespace. And for a better performance you could try parsec with a lexer stage (current code avoids lexer altogether).

For ultimate performance you should use alex and happy tools, which are haskell's lex and yacc respectively.