2013-04-17 11 views
6

私はxml-conduitパーサーを作成しています。私はモナディックに適用する構文を好みます。結合する議論がたくさんあるので、私は多少アプリケーションを失ってしまいます。私の現在の問題には8つの議論があり、結果を構成するのに4番目と6番目のものを使いたいだけです。Control.Applicativeの引数を無視します。

私が動作させる唯一の方法は次のとおりです。しかし、平らなソリューションのための星の空想配置があるはずです:

import Control.Applicative 

a1 :: Applicative Text 
a2 :: Applicative Text 
a3 :: Applicative Text 
a4 :: Applicative Text 
a5 :: Applicative Text 
a6 :: Applicative Text 
a7 :: Applicative Text 
a8 :: Applicative Text 

data Data = Data Text Text 
f :: Text -> Text -> Data 

parser :: Applicative Data 
parser = a1 *> a2 *> a3 *> (f <$> a4 <* a5 <*> a6) <* a7 <* a8 

かっこなしのフォームで同じことを行うための方法はありますか?

parser = f <$> a1 ?? a2 ?? a3 ?? a4 ?? a5 ?? a6 ?? a7 ?? a8 
+2

このようにしてアプリケーションを使用する。残念ながら、プリプロセッサを使用する必要がありますが、それはまだ非常にクールです。 –

+0

@TikhonJelvisありがとう、面白そうです。 –

答えて

9

なるほど、提案リンクApplicative style parser for constructor with two argumentsは答えに私を導いた:(*>)を使用していない、(<$)を使用しています。あなたはいくつかの素晴らしいシンタックスシュガーである、[イディオムブラケット](https://personal.cis.strath.ac.uk/conor.mcbride/pub/she/idiom.html)をチェックアウトする場合があります

parser = f <$ a1 <* a2 <* a3 <*> a4 <* a5 <*> a6 <* a7 <* a8 
関連する問題