私はpure (+1)
がJust (+1)
を生成し、その後Just (+1) <*> Just 2
がJust (2+1)
生成し、その後Just 3
しかし、このような、より複雑な場合にはJust 3
のでpure (+1) <*> Just 2
が生成することを知っている:
-- Define a new type containing a parser function
newtype Parser a = P (String -> [(a,String)])
-- This function apply the parser p on inp
parse :: Parser a -> String -> [(a,String)]
parse (P p) inp = p inp
-- A parser which return a tuple with the first char and the remaining string
item :: Parser Char
item = P (\inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)])
-- A parser is a functor
instance Functor Parser where
fmap g p = P (\inp -> case parse p inp of
[] -> []
[(v, out)] -> [(g v, out)])
-- A parser is also an applicative functor
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)
だから、私が行うとき:
parse (pure (\x y -> (x,y)) <*> item <*> item) "abc"
答えは次のとおりです。
[(('a','b'),"c")]
しかし、私は正確に何が起こるかを理解していません。 最初:
pure (\x y -> (x,y)) => P (\inp1 -> [(\x y -> (x,y), inp1)])
これで、1つのパラメータを持つパーサーが作成されました。その後
:
P (\inp1 -> [(\x y -> (x,y), inp1)]) <*> item
=> P (\inp2 -> case parse (\inp1 -> [(\x y -> (x,y), inp1)]) inp2 of ???
私は本当にここに何が起こるかわかりません。 誰かが段階的に説明してくれるのですか?
fmapの定義に間違いがあります。これは "case pse p inp"であり、 "case p inp"ではありません – yaa
これを修正するための編集を提出しました。 –
'<*>'の定義を調べると、最初に左側のパーサ( 'pg')が入力に適用され、次に右側のパーサ(' px')が残りの部分に適用されることがわかります左側のパーサを適用している文字列ですか?次に、 'item'は常に正確に1文字を消費するパーサーであることが分かりますか?次に、 '純粋なf 'が*入力を消費するパーサーであることが分かりますか?私はこれら3つの部分が答えをまとめるのに十分であると感じます。 – user2407038