我有这个单子对象。
data Parser a = Parser (String -> Maybe (a, String))
instance Functor Parser where
-- fmap :: (a -> b) -> Parser a -> Parser b
fmap f (Parser pa) = Parser $ \input -> case pa input of
Nothing -> Nothing
Just (a, rest) -> Just (f a, rest)
instance Applicative Parser where
pure = return
(<*>) = ap
instance Monad Parser where
--return :: a -> Parser a
return a = Parser $ \input -> Just (a, input)
--(>>=) :: Parser a -> (a -> Parser b) -> Parser b
(Parser pa) >>= f = Parser $ \input -> case pa input of
Nothing -> Nothing
Just (a,rest) -> parse (f a) rest
我有这个定义,item有人告诉我“读一个字符”,但我真的看不到任何读物。
item :: Parser Char
item = Parser $ \ input -> case input of "" -> Nothing
(h:t) -> Just (h, t)
但是好吧,好吧,也许我应该放松一下“阅读”这个词的字面意思并与之相适应。继续前进,我有
failParse :: Parser a
failParse = Parser $ \ input -> Nothing
sat :: (Char -> Bool) -> Parser Char
sat p = do c <- item
if p c
then return c
else failParse
这就是我很困惑的地方。变量中存储了c什么?由于item是一个Parserwith parameter Char,我的第一个猜测是c存储这样一个对象。但是经过一秒钟的思考,我知道现在do符号不起作用,你没有得到 monad,你得到了 monad 的内容。太好了,但那告诉我c就是功能
\ input -> case input of "" -> Nothing
(h:t) -> Just (h, t)
但显然这是错误的,因为定义的下一行sat视为c一个角色。这不仅不是我所期望的,而且它的结构比我所期望的低了三个级别!不是函数,不是Maybe对象,也不是元组,而是Just埋在函数内部的元组的左坐标!那个小角色是怎么在外面工作的?是什么指示<-提取单子的这一部分?