I have the string \"1001\" and I want the string \"9\".
The numeric library has the (rather clunky) showIntAtBase, but I haven\'t been able to find the opposite.
Here is more or less what you were looking for from Prelude. From Numeric:
(NB: readInt is the "dual" of showIntAtBase, and readDec is the "dual" of showInt. The inconsistent naming is a historical accident.)
import Data.Char (digitToInt)
import Data.Maybe (listToMaybe)
import Numeric (readInt)
readBin :: Integral a => String -> Maybe a
readBin = fmap fst . listToMaybe . readInt 2 (`elem` "01") digitToInt
-- readBin "1001" == Just 9