4

スタイル関連のパーサーの質問に対する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」が見つかりません。あまり役に立たないからですか?

4

1 に答える 1

10

問題はよくわかりません。すべてのモナドは適用可能なファンクターでもあるため(*>)、モナド式でも簡単に使用できます。

(この回答の時点(2011年)ではApplicative、のスーパークラスではなかったMonadため、対応するクラスインスタンスを追加する必要があった可能性があります。)

于 2011-10-24T11:38:51.547 に答える