Como faço para que o Parsec me deixe chamar `read` :: Int?

Eu tenho o seguinte, que tipo de cheques:

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

Agora, como o nome da função implica, eu quero que ele me dê um Int. Mas se eu fizer isso:

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

Eu recebo este tipo de erro:

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

Existe uma maneira mais simples e mais limpa de analisar inteiros que podem ter espaços em branco? Ou uma maneira de consertar isso?

Por fim, quero que isso seja parte do seguinte:

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

que é analisar linhas que se parecem com isso:

BETA  6 11 5 24 -1 oiiio

Assim, posso eventualmente chamar um construtor BetaPair que precisará desses valores (alguns como Int, alguns como outros tipos como [Exposure] e Parallel)

(se você está curioso, este é um analisador para um formato de arquivo que representa, entre outras coisas, pares de cadeias beta ligadas a hidrogênio em proteínas. Eu não tenho controle sobre o formato do arquivo!)

questionAnswers(3)

yourAnswerToTheQuestion