Вы пытаетесь нетривиальным преобразованием из нотации do в нотацию связывания, я рекомендую сделать это "тривиальным" способом, а затем сделать его бессмысленным.
Напомним:
x <- m === m >>= \x ->
let x = e === let x = e in
Тогда у вас есть:
parseNumber = many1 digit >>= \x ->
let y = read x in
return (Number y)
(я удалил $
, чтобы избежать проблем с приоритетами.)
Затем мы можем преобразовать это в:
parseNumber = many1 digit >>= \x -> return (Number (read x))
= many1 digit >>= return . Number . read
Теперь, если вы хотите использовать liftM
, вам нужно прекратить использовать bind, поскольку поднятая функция ожидает монадическое значение в качестве аргумента.
parseNumber = liftM (Number . read) (many1 digit)