[Haskell-cafe] A very nontrivial parser

Andrew Coppin andrewcoppin at btinternet.com
Thu Jul 5 15:45:14 EDT 2007


Jonathan Cast wrote:
> On Thursday 05 July 2007, Andrew Coppin wrote:
>   
>> ...OK, anybody have a solution that works in Haskell 98?
>>     
>
> Rank-2 types are perhaps /the/ most common, widely accepted extension to 
> Haskell 98, after the approved addendum for FFI and the draft addendum for 
> hierarchical modules.  I would really be concerned about using them (it's 
> certainly not like they're going to just disappear on you one day, like say 
> functional dependencies almost certainly will).  But that's just me.
>   

Personally, I just try to avoid *all* language extensions - mainly 
because most of them are utterly incomprehensible. (But then, perhaps 
that's just because they all cover extremely rare edge cases?)

MPTCs and ATs look useful. The rest... hmm. If I ever figure out what 
they do, maybe I can comment.

>> And finally, after I correct all of those, I get an error saying that
>> the compiler can't match [the hidden type variable] against [some
>> suitable type for that variable]. And in a pattern of all things!
>> (Surely if it's not the right type at runtime, it should generate an
>> exception, just like if you use the wrong constructor...?)
>>     
>
> Just a side point but: how would it know?  Leaving aside the 
> dictionary-passing used for type classes, Haskell has (and has always had) a 
> type-erasure semantics, which rules out runtime type errors.
>   

Usually if you have something like

  let (Foo x) = process x y z

and it turns out that the 'process' function returns another 
constructor, you get an error. Well you'd expect the same thing to 
happen if the result type happens to be a 'hidden' type. But apparently 
not...

>> So *neeer* :-P
>>     
>
> My first thought is that surely you must have said
>
> newtype Parser state x y
>   = forall src. Source src => Parser ((state, src x) -> (state, src x, y))
>
> when you meant
>
> newtype Parser state x y
>   = Parser (forall src. Source src => (state, src x) -> (state, src x, y))
>
> The relative order of the constructor name and the forall is very important!  
>   

Care to explain what's different about these apparently identical 
declarations?



More information about the Haskell-Cafe mailing list