2013-04-17 8 views
6

Я пишу синтаксический анализатор xml-pipe, и я предпочитаю аппликативный синтаксис для монадического. С большим количеством аргументов, чтобы объединиться, я немного теряюсь в аппликативном. Моя текущая проблема дается 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

Вы можете проверить [идиому скобку] (https://personal.cis.strath.ac.uk/conor.mcbride/pub/she/idiom.html), что некоторый хорошо синтаксис для использования аппликаций таким образом. К сожалению, это требует использования препроцессора, но это все еще очень круто. –

+0

@TikhonJelvis Спасибо, выглядит интересно. –

ответ