4

私はこのモナドオブジェクトを持っています。

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か? itemParserwith parameterであるため、そのようなオブジェクトを格納Charしていると最初に推測します。cしかし、少し考えてみると、記法が機能しないことがわかりdoました。モナドを取得せず、モナドの内容を取得します。素晴らしいですcが、それは機能であることを教えてくれます

\ input -> case input of ""    -> Nothing
                         (h:t) -> Just (h, t)

しかし、定義の次の行が文字のようにsat扱われるため、明らかにそれは間違っていcます。それは私が期待したものではないだけでなく、私が期待したものから約 3 レベル構造が下がっています! 関数でも、オブジェクトでも、タプルでもなく、関数内に埋め込まれMaybeたタプルの左座標です! Justその小さなキャラクターは、外でどのように働いているのですか? <-モナドのこの部分を抽出するように指示しているのは何ですか?

4

2 に答える 2