我有这个单子对象。
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
是一个Parser
with parameter Char
,我的第一个猜测是c
存储这样一个对象。但是经过一秒钟的思考,我知道现在do
符号不起作用,你没有得到 monad,你得到了 monad 的内容。太好了,但那告诉我c
就是功能
\ input -> case input of "" -> Nothing
(h:t) -> Just (h, t)
但显然这是错误的,因为定义的下一行sat
视为c
一个角色。这不仅不是我所期望的,而且它的结构比我所期望的低了三个级别!不是函数,不是Maybe
对象,也不是元组,而是Just
埋在函数内部的元组的左坐标!那个小角色是怎么在外面工作的?是什么指示<-
提取单子的这一部分?