Haskell: Как реализовать >> = для парсера - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующий 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)]

Но прежде чем я углублюсь в это, я хотел проверить, соответствует ли мое запутанное описание того, что я должен делать,

1 Ответ

0 голосов
/ 09 декабря 2018
instance Monad Parser where
    return v = P (\inp -> [(v,inp)])
    P p >>= f = P (\inp -> do
        (x,u) <- p inp
        let P q = f x
        q u
        )
...