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!)