Re: [Haskell-cafe] a little parsec enhancement

2013-09-09 Thread Petr Pudlák
I'd appreciate exporting adding such aliases for creating and running 
ParsecT the 3.1.x way.


  Thanks,
  Petr

Dne 09/06/2013 10:56 PM, Antoine Latter napsal(a):
The exported `mkPT` is equivalent to the old 'ParsecT' data 
constructor from parsec 3.0.x.


I wouldn't mind exporting a similar alias for the new 'ParsecT' 
constructor from 3.1.x.



On Fri, Sep 6, 2013 at 2:21 PM, Petr Pudlák petr@gmail.com 
mailto:petr@gmail.com wrote:


Dne 09/05/2013 01:38 PM, Roman Cheplyaka napsal(a):

* Petr Pudlák petr@gmail.com mailto:petr@gmail.com
[2013-09-05 11:18:25+0200]

Unfortunately |ParsecT| constructor isn't exported so I'm
not able to
implement it outside /parsec/.

No, but there's an 'mkPT' function which is equivalent to the
ParsecT
constructor.

(Although I, too, wish the ParsecT constructor were exposed.)

Roman

Yes, I tried to use `mkPT`, but the result looked very complicated
and I wasn't quite sure if it'll be working correctly in all
cases. Implementing the same thing with the `ParsecT` constructor
is simple and comprehensible.

  Best regards,
  Petr




___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] a little parsec enhancement

2013-09-06 Thread Petr Pudlák

Dne 09/05/2013 01:38 PM, Roman Cheplyaka napsal(a):

* Petr Pudlák petr@gmail.com [2013-09-05 11:18:25+0200]

Unfortunately |ParsecT| constructor isn't exported so I'm not able to
implement it outside /parsec/.

No, but there's an 'mkPT' function which is equivalent to the ParsecT
constructor.

(Although I, too, wish the ParsecT constructor were exposed.)

Roman
Yes, I tried to use `mkPT`, but the result looked very complicated and I 
wasn't quite sure if it'll be working correctly in all cases. 
Implementing the same thing with the `ParsecT` constructor is simple and 
comprehensible.


  Best regards,
  Petr

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] a little parsec enhancement

2013-09-06 Thread Antoine Latter
The exported `mkPT` is equivalent to the old 'ParsecT' data constructor
from parsec 3.0.x.

I wouldn't mind exporting a similar alias for the new 'ParsecT' constructor
from 3.1.x.


On Fri, Sep 6, 2013 at 2:21 PM, Petr Pudlák petr@gmail.com wrote:

 Dne 09/05/2013 01:38 PM, Roman Cheplyaka napsal(a):

  * Petr Pudlák petr@gmail.com [2013-09-05 11:18:25+0200]

 Unfortunately |ParsecT| constructor isn't exported so I'm not able to
 implement it outside /parsec/.

 No, but there's an 'mkPT' function which is equivalent to the ParsecT
 constructor.

 (Although I, too, wish the ParsecT constructor were exposed.)

 Roman

 Yes, I tried to use `mkPT`, but the result looked very complicated and I
 wasn't quite sure if it'll be working correctly in all cases. Implementing
 the same thing with the `ParsecT` constructor is simple and comprehensible.

   Best regards,
   Petr

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] a little parsec enhancement

2013-09-05 Thread Petr Pudlák

Hi,

when thinking about this SO question 
http://stackoverflow.com/q/18583416/1333025, I couldn't find a 
combinator that allows a parser to /optionally/ fail without consuming 
input, or consume input and return its value. So I'm suggesting such a 
function:


|-- | @emptyIf p@ parses @p@ and if its return value is @Nothing@, pretends
-- that an error has occured with no input consumed.
--
-- If @p@ fails and consumes some input, so does @emptyIf p@. Combine with
-- 'try' if this is undesirable.

emptyIf  :: (Stream  s m t) =ParsecT  s u m (Maybe  a) -ParsecT  s u m a
emptyIf  p =ParsecT  $ \s cok  cerr eok eerr -
let  cok' (Just  x) s e = cok x s e
cok'Nothing   _ e = eerr e
eok' (Just  x) s e = eok x s e
eok'Nothing   _ e = eerr e
in  unParser p s cok' cerr eok' eerr|

With this function, the answer to the SO question becomes really easy:

|rcomb  :: (Stream  s m t) =ParsecT  s u m a -ParsecT  s u m b -ParsecT  s u 
m b
rcomb  p q = emptyIf $ runMaybeT (opt p * opt q)
  where
opt =MaybeT  . optional-- optional from Control.Applicative!|

Whenever |p| or |q| fails without consuming input, then |rcomb p q| 
fails without consuming input.


Unfortunately |ParsecT| constructor isn't exported so I'm not able to 
implement it outside /parsec/. (Perhaps it would make sense to export 
|ParsecT| in some module such as |Text.Parsec.Internal|?) Therefore I'm 
suggesting to add such a function to /parsec/ (darcs patch included). 
Perhaps change the name, I couldn't think of anything better.


Best regards,
Petr

1 patch for repository http://code.haskell.org/parsec3:

Thu Sep  5 11:12:47 CEST 2013  Petr Pudlak p...@pudlak.name
  * Add 'emptyIf' which allows a parser to optinally fail without consuming any 
input.

New patches:

[Add 'emptyIf' which allows a parser to optinally fail without consuming any 
input.
Petr Pudlak p...@pudlak.name**20130905091247
 Ignore-this: 59b93c660fe860acd9a5fff887f7678f
] {
hunk ./Text/Parsec/Prim.hs 38
 , parserPlus
 , (?)
 , (|)
+, emptyIf
 , label
 , labels
 , lookAhead
hunk ./Text/Parsec/Prim.hs 455
 p' = ParsecT $ \s cok cerr eok eerr -
  unParser p s eok cerr eok eerr
 
+-- | @emptyIf p@ parses @p@ and if its return value is @Nothing@, pretends
+-- that an error has occured with no input consumed.
+--
+-- If @p@ fails and consumes some input, so does @emptyIf p@. Combine with
+-- 'try' if this is undesirable.
+
+emptyIf :: (Stream s m t) = ParsecT s u m (Maybe a) - ParsecT s u m a
+emptyIf p = ParsecT $ \s cok  cerr eok eerr -
+let cok' (Just x) s e = cok x s e
+cok' Nothing  _ e = eerr e
+eok' (Just x) s e = eok x s e
+eok' Nothing  _ e = eerr e
+in unParser p s cok' cerr eok' eerr
+  
+
 -- | The parser @token showTok posFromTok testTok@ accepts a token @t@
 -- with result @x@ when the function @testTok t@ returns @'Just' x@. The
 -- source position of the @t@ should be returned by @posFromTok t@ and
}

Context:

[Fix haddock module links.
Bjorn Buckwalter bj...@buckwalter.se**20130821095713
 Ignore-this: 304217ec8b73f59edcd96dd13aca67af
] 
[TAG 3.1.3
Antoine Latter aslat...@gmail.com**20120612020909
 Ignore-this: 7100375a3e4853c09f1ea993ae32eed7
] 
Patch bundle hash:
173111b8bbc5a6eb69d41926053184c35ae9b3cc
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] a little parsec enhancement

2013-09-05 Thread Roman Cheplyaka
* Petr Pudlák petr@gmail.com [2013-09-05 11:18:25+0200]
 Unfortunately |ParsecT| constructor isn't exported so I'm not able to
 implement it outside /parsec/.

No, but there's an 'mkPT' function which is equivalent to the ParsecT
constructor.

(Although I, too, wish the ParsecT constructor were exposed.)

Roman


signature.asc
Description: Digital signature
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe