私はこのモナドオブジェクトを持っています。
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
ました。モナドを取得せず、モナドの内容を取得します。素晴らしいですc
が、それは機能であることを教えてくれます
\ input -> case input of "" -> Nothing
(h:t) -> Just (h, t)
しかし、定義の次の行が文字のようにsat
扱われるため、明らかにそれは間違っていc
ます。それは私が期待したものではないだけでなく、私が期待したものから約 3 レベル構造が下がっています! 関数でも、オブジェクトでも、タプルでもなく、関数内に埋め込まれMaybe
たタプルの左座標です! Just
その小さなキャラクターは、外でどのように働いているのですか? <-
モナドのこの部分を抽出するように指示しているのは何ですか?