Путаница в монадических типах

Я прохожу Write Yourself a Scheme in Haskell. Это отличный учебник, но я столкнулся с проблемой в одном из упражнений синтаксический разбор:

parseNumber :: Parser LispVal
parseNumber = liftM (Number . read) $ many1 digit

Перепишите parseNumber, используя:

  1. Do-notation
  2. явную последовательность с оператором >>=

У меня не было проблем с do-notation:

parseNumber :: Parser LispVal
parseNumber = do x <- many1 digit 
                 let y = read x
                 return $ Number y

Для #2 я пробовал кучу вариаций, таких как:

parseNumber :: Parser LispVal
parseNumber = (many1 digit) >>= (liftM (Number . read))

но я продолжаю сталкиваться с ошибками типа. У меня два вопроса.

  1. Почему я получаю ошибки типа? Я неправильно понимаю монадический оператор связывания?
  2. Почему я не получаю подобных ошибок типа с моим решением do-notation?

Мне кажется, что я упускаю фундаментальную концепцию относительно типов?

6
задан dbyrne 16 March 2011 в 02:52
поделиться