Jak uzyskać Parsec, aby pozwolić mi wywołać `read` :: Int?

Mam następujące, które sprawdzają:

p_int = liftA read (many (char ' ') *> many1 digit <* many (char ' '))

Teraz, jak sugeruje nazwa funkcji, chcę, żeby dał mi Int. Ale jeśli to zrobię:

p_int = liftA read (many (char ' ') *> many1 digit <* many (char ' ')) :: Int

Dostaję ten błąd typu:

Couldn't match expected type `Int' with actual type `f0 b0'
In the return type of a call of `liftA'
In the expression:
    liftA read (many (char ' ') *> many1 digit <* many (char ' ')) ::
      Int
In an equation for `p_int':
    p_int
      = liftA read (many (char ' ') *> many1 digit <* many (char ' ')) ::
          Int

Czy istnieje prostszy i czystszy sposób analizowania liczb całkowitych, które mogą mieć białe znaki? Lub sposób na to naprawić?

Ostatecznie chcę, żeby to było częścią następujących:

betaLine = string "BETA " *> p_int <*> p_int  <*> p_int <*>
           p_int <*> p_parallel <*> p_exposure <* eol

co ma na celu przeanalizowanie linii, które wyglądają tak:

BETA  6 11 5 24 -1 oiiio

Mogę więc w końcu wywołać konstruktor BetaPair, który będzie potrzebował tych wartości (niektóre jako Int, niektóre jako inne typy, takie jak [Exposure] i Parallel)

(jeśli jesteś ciekawy, jest to parser dla formatu pliku, który reprezentuje, między innymi, wiązane wiązaniem wodorowym pary beta-nici w białkach. Nie mam kontroli nad formatem pliku!)

questionAnswers(3)

yourAnswerToTheQuestion