Не давать сигнатуры типов экземпляров.
Отступ в определениях экземпляров.
После этих двух вещейвы увидите новую ошибку, вам нужно определить экземпляр Applicative, потому что class Applicative m => Monad m
.
РЕДАКТИРОВАТЬ:
Вы писали:
instance Monad Parser where
(>>=) :: Parser a -> (a -> Parser b) -> Parser b -- This is a type signature
p >>= f = P (\inp -> case parse p inp of -- This is the definition
[] -> []
[(v,out)] -> parse (f v) out)
Первая проблема былатип подписи, который я отметил через комментарий выше.Удалите это:
instance Monad Parser where
p >>= f = P (\inp -> case parse p inp of -- This is the definition
[] -> []
[(v,out)] -> parse (f v) out)
Вторая проблема заключалась в отступе.Вы должны сделать отступ в определениях функций-членов (или использовать фигурные скобки, но это необычный стиль):
instance Monad Parser where
p >>= f = P (\inp -> case parse p inp of
[] -> []
[(v,out)] -> parse (f v) out)
Теперь вы получаете новую ошибку, в которой говорится, что вам нужен аппликативный экземпляр.Поэтому вам понадобится:
instance Applicative Parser where
pure = ...
(<*>) = ...
И даже после этого он скажет вам написать экземпляр для Functor.