У меня есть объект синтаксического анализа определен: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 или < *> в этом случае?
Любые советы по поводу того, что < *> было бы или как я должен работать, это ценится.
Спасибо.
Вы можете найти источник для 'ap' здесь: http://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.Base.html#ap (хотя забавное упражнение для его работы вне себя). замените вхождения 'return' и' >> = 'своими правыми сторонами из реализованных вами реализаций (как и в классе алгебр) – jberryman