У меня есть следующий Parser
newtype Parser a = P (String -> [(a,String)])
, и мне нужно реализовать привязку для его реализации в виде монады.У меня есть, что возвращение определяется как
instance Monad Parser where
return v = P (\inp -> [(v,inp)])
Для реализации p >>= f
Я знаю это много: p
это объект Parser и f имеет объявление типа
f :: a -> Parser b
Так что яЯ думаю, что значение p >>= f
должно быть объектом Parser, который оборачивает функцию.Аргумент этой функции - строка.Поэтому я предполагаю, что функция должна «открыть p
», получить ее функцию, применить ее к входной строке, получить объект типа [(a, String)], а затем ... Я думаю, может быть, применить f
к каждой первой координате в каждом кортеже, затем используйте полученную функцию парсера и примените ее ко второй координате ... и составьте список всех этих кортежей?
В этот момент я довольно туманно понимаю, правильно ли я понял, и если да, то как это сделать.Может быть, мне следует написать вспомогательную функцию с типом
trans :: [(a,String)] -> (a -> Parser b) -> [(b,String)]
Но прежде чем я углублюсь в это, я хотел проверить, соответствует ли мое запутанное описание того, что я должен делать,