2016-12-18 3 views
0

У меня есть объект синтаксического анализа определен:Haskell: Как вы определяете определение <*> из определения Monad?

newtype Parser a = Parser (String -> [(String, a)]) 

и функция для их производств:

produce :: a -> Parser a 
produce x = Parser (\ts -> [(ts, x)]) 

и экземпляр монады для этого синтаксического анализа объекта, чтобы позволить мне связать несколько парсеров в одно:

instance Monad Parser where 
    return = produce 
    Parser px >>= f = Parser (\ts -> 
    concat([parse (f x) ts' | (ts', x) <- px ts])) 

Я также использовал < *> довольно счастливо, чтобы связать несколько парсеров для разных типов, чтобы разобрать строку с разными части внутри него.

Конечно < *> определяется с помощью следующих действий:

(<*>) = ap 

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

Итак, как я могу выяснить, как явно найти определение ap или < *> в этом случае?

Любые советы по поводу того, что < *> было бы или как я должен работать, это ценится.

Спасибо.

+2

Вы можете найти источник для 'ap' здесь: http://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.Base.html#ap (хотя забавное упражнение для его работы вне себя). замените вхождения 'return' и' >> = 'своими правыми сторонами из реализованных вами реализаций (как и в классе алгебр) – jberryman

ответ

2

Вы можете начать с

f <*> x = do 
    f' <- f 
    x' <- x 
    return (f' x') 

или, что то же самое

f <*> x = 
    f  >>= (\f' -> 
    x  >>= (\x' -> 
    return (f' x'))) 

, а затем расширить >>= и return по мере необходимости.

Смежные вопросы