как вывести промежуточный шаг восстановления функции Monadi c в Haskell - PullRequest
0 голосов
/ 11 апреля 2020

Я читаю книгу Программирование в 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 для образовательных / учебных целей. Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...