Я читаю книгу Программирование в Haskell 2-е Грэма Хаттона. https://www.cs.nott.ac.uk/~pszgmh/pih.html#slides
Когда речь идет о главе 13.4 Анализаторы последовательности, он содержит следующие функции:
> parse three "abcdef"
[((’a’,’c’),"def")]
> parse three "ab"
[]
Я хотел бы понять, каковы промежуточные шаги для оцените их за сценой. Вы можете найти рабочий исходный код для Parser здесь:
module Parser where
newtype Parser a = P { parse :: String -> [(a, String)] }
instance Functor Parser where
fmap g p = P (\inp -> case parse p inp of
[] -> []
[(v, out)] -> [(g v, out)])
instance Applicative Parser where
pure v = P (\inp -> [(v, inp)])
pg <*> px = P (\inp -> case parse pg inp of
[] -> []
[(g, out)] -> parse (fmap g px) out)
item :: Parser Char
item = P (\inp -> case inp of
[] -> []
(x:xs) -> [(x, xs)])
g :: a -> p -> b -> (a, b)
g x y z = (x, z)
three :: Parser (Char, Char)
three = pure g <*> item <*> item <*> item
instance Monad Parser where
-- (>>=) :: Parser a -> (a -> Parser b) -> Parser b
p >>= f = P (\inp -> case parse p inp of
[] -> []
[(v,out)] -> parse (f v) out)
threeM :: Parser (Char,Char)
threeM = do x <- item
item
z <- item
return (x,z)
main = do
parse threeM "abc"
parse three "abc"
--ghc Parser.hs -ddump-ds -dsuppress-all
Есть похожий вопрос о том, как это сделать для Functor и Applicative: Как напечатать промежуточный результат в Functor и Applicative в Haskell
Как выполнить аналогичное сокращение с версией Monad?
Вот список известных вопросов без удовлетворительных ответов на этот вопрос:
Распечатка шагов оценки (переписывания) Haskell для образовательных / учебных целей. Возможно ли это?