スタイル関連のパーサーの質問に対するAnthonyの応答を読んだ後、私は、モナディックパーサーを作成することはまだかなりコンパクトである可能性があることを自分自身に納得させようとしていました。
だから代わりに
reference :: Parser Transc
reference = try $ do string "#{"
a <- number
char ','
b <- number
char ','
c <- number
char '}'
return $ Outside (a,b,c)
私たちは単に持つことができます:
reference3 :: Parser Transc
reference3 = liftM3 (((Outside .).) . (,,))
(string "#{" >> number <<! char ',')
number
(char ',' >> number <<! char '}') where
(<<!) = liftM2 const
これは、Anthonyが提供するアプリケーションバージョンと非常によく似ています。
reference2 :: Parser Transc
reference2 = ((Outside .) .) . (,,)
<$> (string "#{" *> number2 <* char ',')
<*> number2
<*> (char ',' *> number2 <* char '}')
... 「シーケンスしますが、値を破棄し、左側に提供された値を使用する」という意味として定義されている<<!
ものと概念的に類似している演算子を除きます。<*
liftA2 const
もちろん、<<はの悪い名前だったでしょう。それは、とと同じ論理に従う場合と同等liftM2 const
であることを示唆しているでしょう。<<
flip >>
>>=
=<<
単一の名前で「liftM2const」が見つかりません。あまり役に立たないからですか?