json analizando en haskell

Estoy tratando de analizar los datos JSON en haskell. Después de haber visitado una gran cantidad de sitios web, esto es lo más lejos que he podido llegar.

data Address = Address { house :: Integer, street :: String, city :: String, state :: String, zip :: Integer } deriving (Show)
data Person = Person { name :: String, age :: Integer, address :: Address } deriving (Show)

getName :: Person -> String
getName (Person n _ _) = n

getAddress :: Person -> Address
getAddress (Person _ _ a) = a

getState :: Address -> String
getState (Address _ _ _ s _) = s

Escribo eso en un archivo ex.hs y lo cargo en ghci ->

Prelude> import Text.JSON
Prelude Text.JSON> :load ex
Main Text.JSON> let aa = "{\"name\": \"some body\", \"age\" : 23, \"address\" : {\"house\" : 285, \"street\" : \"7th Ave.\", \"city\" : \"New York\", \"state\" : \"New York\", \"zip\" : 10001}}"
...> decode aa :: Result JSValue

Vuelve

Ok (JSObject (JSONObject {fromJSObject = [("name",JSString (JSONString {fromJSString = "some body"})),("age",JSRational False (23 % 1)),("address",JSObject (JSONObject {fromJSObject = [("house",JSRational False (285 % 1)),("street",JSString (JSONString {fromJSString = "7th Ave."})),("city",JSString (JSONString {fromJSString = "New York"})),("state",JSString (JSONString {fromJSString = "New York"})),("zip",JSRational False (10001 % 1))]}))]}))

No hace falta decir que parece bastante verboso (y aterrador). Traté de hacer

...> decode aa :: Result Person

y me dio un error. ¿Cómo hago para poblar una instancia de la estructura de datos Person de esta cadena json? Por ejemplo, ¿qué debo hacer para obtener el estado de la persona en la cadena JSON ...