unhappy rant
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME0.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 396 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME1.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 609 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME2.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 359 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME3.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 321 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME4.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 460 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME5.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 227 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME6.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 437 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME7.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 586 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME8.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 426 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/MEME9.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 473 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								site/writings/unhappy/UNHAPPY.PNG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										256
									
								
								site/writings/unhappy/index.org
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,256 @@
 | 
			
		||||
#+title: Unhappy About Happy: A Reflection or Something Like That
 | 
			
		||||
#&summary
 | 
			
		||||
Rant about Haskell's parser "Happy".
 | 
			
		||||
#&
 | 
			
		||||
#+license: wtfpl
 | 
			
		||||
#+startup: showall
 | 
			
		||||
#&toc
 | 
			
		||||
 | 
			
		||||
#&img;url=UNHAPPY.PNG,float=right
 | 
			
		||||
 | 
			
		||||
* Unhappy About Happy: A Reflection or Something Like That
 | 
			
		||||
 | 
			
		||||
For the purposes of my quiet rage, this document will be written in all caps.
 | 
			
		||||
I also will not use proper language.  I won't even give suggestions on how to
 | 
			
		||||
improve Happy; I'll just complain.
 | 
			
		||||
 | 
			
		||||
STARTING NOW
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
** WHAT HAPPY ???
 | 
			
		||||
 | 
			
		||||
HAPPY IS PARSER GENERATOR.  IT GENERATE HASKELL CODE.  VISIT
 | 
			
		||||
[[http://www.haskell.org/happy/][HTTP://WWW.HASKELL.ORG/HAPPY/]] FOR UGLY INFO.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
** HOW HAPPY GOOD
 | 
			
		||||
 | 
			
		||||
+ EFFICIENT I GUESS
 | 
			
		||||
+ WORKS OK
 | 
			
		||||
+ PRETTY LOGO
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
** WHY I NOT LIKE HAPPY
 | 
			
		||||
 | 
			
		||||
*** JUZT TYPICAL
 | 
			
		||||
 | 
			
		||||
#+caption: ONE REASON.  TRUST NOT BUSH WITH HAPPY
 | 
			
		||||
#&img;url=MEME0.PNG,float=center
 | 
			
		||||
 | 
			
		||||
ONE ERROR IN PARSER.Y GIVE HUGE TYPE ERROR
 | 
			
		||||
 | 
			
		||||
*WHAT IS THIS!*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#+BEGIN_SRC
 | 
			
		||||
dist/build/l0c/l0c-tmp/Language/L0/Parser/Parser.hs:2452:42:
 | 
			
		||||
    Couldn't match type `Value' with `BasicValue -> Value'
 | 
			
		||||
    Expected type: HappyAbsSyn
 | 
			
		||||
                     (Name, SrcLoc)
 | 
			
		||||
                     [(Name,
 | 
			
		||||
                       DeclTypeBase Name,
 | 
			
		||||
                       [ParamBase Name],
 | 
			
		||||
                       ExpBase NoInfo Name,
 | 
			
		||||
                       SrcLoc)]
 | 
			
		||||
                     (Name,
 | 
			
		||||
                      DeclTypeBase Name,
 | 
			
		||||
                      [ParamBase Name],
 | 
			
		||||
                      ExpBase NoInfo Name,
 | 
			
		||||
                      SrcLoc)
 | 
			
		||||
                     Uniqueness
 | 
			
		||||
                     ([Maybe (DimSize Name)], ElemTypeBase NoInfo Name)
 | 
			
		||||
                     (ElemTypeBase NoInfo Name)
 | 
			
		||||
                     [TypeBase NoInfo Name]
 | 
			
		||||
                     [TypeBase NoInfo Name]
 | 
			
		||||
                     [ParamBase Name]
 | 
			
		||||
                     (Maybe (CertificatesBase NoInfo Name), [ExpBase NoInfo Name])
 | 
			
		||||
                     [ExpBase NoInfo Name]
 | 
			
		||||
                     [ExpBase NoInfo Name]
 | 
			
		||||
/* ... 200-300 MORE LINES ... */
 | 
			
		||||
                        [TupIdentBase NoInfo Name]
 | 
			
		||||
                        (TupIdentBase NoInfo Name)
 | 
			
		||||
                        (LambdaBase NoInfo Name)
 | 
			
		||||
                        (TupleLambdaBase NoInfo Name)
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        Int
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        Value
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        (BasicValue -> Value)
 | 
			
		||||
                        [Value]
 | 
			
		||||
                        [Value]
 | 
			
		||||
    In the second argument of `happySpecReduce_3', namely
 | 
			
		||||
      `happyReduction_191'
 | 
			
		||||
    In the expression: happySpecReduce_3 38# happyReduction_191
 | 
			
		||||
    In an equation for `happyReduce_191':
 | 
			
		||||
        happyReduce_191 = happySpecReduce_3 38# happyReduction_191
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
*NOT NICE NOT NICE AT ALL*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
*** MONADA CAN I HAZ
 | 
			
		||||
 | 
			
		||||
MAYHAPS U NEED TO PARSE DIFFERENT THAN NORMAL KAY.  HOW U THINK.  YES:
 | 
			
		||||
MENTALINCRMENTAL PARSING IT IS
 | 
			
		||||
 | 
			
		||||
#+caption: TWO REASON (I UNGOOD TO MEMES)
 | 
			
		||||
#&img;url=MEME1.PNG,float=center
 | 
			
		||||
 | 
			
		||||
YOU GOT NEED TO PARSE IO GETLINE SOURCES YEAH
 | 
			
		||||
 | 
			
		||||
PARSE EXPRESSION "2 + 1 *4" OVER MULTI LINES LIKE THIS HERE
 | 
			
		||||
 | 
			
		||||
#+BEGIN_SRC
 | 
			
		||||
WELCOM TO DA FUNKY MULTILINE EXPRESSION PARSER; ENTER UR EXPRESSION
 | 
			
		||||
> 2 +
 | 
			
		||||
1 *4
 | 
			
		||||
TY GOT IT!!  PARSED EXPRESSION IS "2 + 1 * 4" AND U NICE; RESULT IS 6 BTW
 | 
			
		||||
>
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
PARSER SHOULD KNOW "YEAH NOT DUHNE PARSIN YET" WHEN "2 +" READ, SHOULD TEHN
 | 
			
		||||
READ NEW LINE AND PARSE MORE!
 | 
			
		||||
 | 
			
		||||
WE CAN PARSE FROM BEGINNING EVERY TIME SURE BUT INEFECICIENT!!!
 | 
			
		||||
 | 
			
		||||
#+caption: WE NOT WANT TIS SAYS PICARD 8-)
 | 
			
		||||
#&img;url=MEME2.PNG,float=center
 | 
			
		||||
 | 
			
		||||
BUT HOW WE SHOULD / COULD DO THAT SMARTLY I IMPLORE TO LIKE ASK U
 | 
			
		||||
 | 
			
		||||
#+caption: CLEVER GILES HAS OUR SOLUTION!!!!!
 | 
			
		||||
#&img;url=MEME3.PNG,float=center
 | 
			
		||||
 | 
			
		||||
YES WE USE CONTINUATION WHICH SMART.  LOOK ATTOPARSEC USE CONTINUATION IN
 | 
			
		||||
RETURN!
 | 
			
		||||
[[http://hackage.haskell.org/package/attoparsec-0.11.1.0/docs/Data-Attoparsec-Text.html#t:IResult][HTTP://HACKAGE.HASKELL.ORG/PACKAGE/ATTOPARSEC-0.11.1.0/DOCS/DATA-ATTOPARSEC-TEXT.HTML#T:IRESULT]]
 | 
			
		||||
 | 
			
		||||
YEAH BUT NOT IN HAPPY............
 | 
			
		||||
 | 
			
		||||
SO WE MAKE IT MANUAL.  WE SPECIFY OWN LEXER AND IMPROVE MONAD.  WHEN END OF
 | 
			
		||||
LINE IS REACH, WE TELL PARSER (FROM INSIDE DA PRASER) DAT DERE IS NO MORE EVER;
 | 
			
		||||
IF THAT FAILS WE CATCH ERROR (EITHER-LIKE MONAD) AND READ NEW LINE FOR REALS
 | 
			
		||||
 | 
			
		||||
#+caption: AS MANY LINES AS LE POSSIBLÉ
 | 
			
		||||
#&img;url=MEME4.PNG,float=center
 | 
			
		||||
 | 
			
		||||
CLEVER SOLUTION OF US!  BUT IN PARSE EXPRESION EXAMPLE ABOV WE USE IO TO GETLINE
 | 
			
		||||
 | 
			
		||||
*WE NOT WANT IO IN ALL PARSING.... EVER EVER!!!!!!!!*
 | 
			
		||||
 | 
			
		||||
HOWTO ABSTRACT IO AWAY?  WE WANT TYPE OF EXPORTED FUNCTIONS FROM PARSER TO NOT
 | 
			
		||||
USE _IO_ /AT ALL/
 | 
			
		||||
 | 
			
		||||
#+caption: YAEH BABBY
 | 
			
		||||
#&img;url=MEME5.PNG,float=center
 | 
			
		||||
 | 
			
		||||
SO WE USE WHATEVER MONAD TO GETLINE RIGHT?
 | 
			
		||||
 | 
			
		||||
#+BEGIN_SRC haskell
 | 
			
		||||
class GetLiner m where -- KAY SO m IS MONAD RIGHT
 | 
			
		||||
  getSomeLine :: m String
 | 
			
		||||
 | 
			
		||||
instance GetLiner IO where
 | 
			
		||||
  getSomeLine = getLine
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
WAIT I DONT GET IT
 | 
			
		||||
 | 
			
		||||
#+BEGIN_SRC haskell
 | 
			
		||||
CLASS GETLINER M WHERE -- KAY SO M IS MONAD RIGHT
 | 
			
		||||
  GETSOMELINE :: M STRING
 | 
			
		||||
 | 
			
		||||
INSTANCE GETLINER IO WHERE
 | 
			
		||||
  GETSOMELINE = GETLINE
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
MUCH BETTR.  COZ TEHN WE CAN USE
 | 
			
		||||
 | 
			
		||||
#+caption: ... THEN WAT.  Y U SO SLACK
 | 
			
		||||
#&img;url=MEME6.PNG,float=center
 | 
			
		||||
 | 
			
		||||
BUT YIAH WE COULD USE TYPE CONSTRAINTS!
 | 
			
		||||
 | 
			
		||||
#+BEGIN_SRC haskell
 | 
			
		||||
LEXER :: GETLINER M => M SOMETHNIG
 | 
			
		||||
LEXER = MEHMEHMEH
 | 
			
		||||
  WOO <- GETSOMELINE
 | 
			
		||||
  MEH MEH
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
SURE COULD WORK WE NEED JUST TELL HAPPY BOUT IT.
 | 
			
		||||
 | 
			
		||||
#+BEGIN_SRC
 | 
			
		||||
%MONAD { GETLINER M => SOMETHINNG M }
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
FAILS MISERBLY.................... :-( :( :(
 | 
			
		||||
 | 
			
		||||
WE ARE LEFT 4 PONDER HOW TO SOLVE!  HOWTO ABSTRAKT OUT IO!  HOW!!
 | 
			
		||||
 | 
			
		||||
#+caption: TRANCEND CONVENTIONAL COMPUTATIN U CAPITALIS PIG
 | 
			
		||||
#&img;url=MEME7.PNG,float=center
 | 
			
		||||
 | 
			
		||||
SOOOO..... WE NEED KINDA CONTINUATIN COMPUTATON MONADY THINGY.  I GOT FRIEND
 | 
			
		||||
WHO COME WIT CODE, SAY IT GOOD CODE.  I CHECK, HE RIGHT!  IS HERE
 | 
			
		||||
 | 
			
		||||
#+BEGIN_SRC haskell
 | 
			
		||||
DATA READLINEMONAD A = VALUE A
 | 
			
		||||
                     | GETLINE (STRING -> READLINEMONAD A)
 | 
			
		||||
 | 
			
		||||
INSTANCE MONAD READLINEMONAD WHERE
 | 
			
		||||
  RETURN = VALUE
 | 
			
		||||
  VALUE X >>= F = F X
 | 
			
		||||
  GETLINE G >>= F = GETLINE $ \S -> G S >>= F
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
HA CLEVER!!!  NOW WE NEED NO TYPE CONSTRAINTS BECAUSE NOW COMPUTATION IS MONAD
 | 
			
		||||
ITSELF!  HOW YOU ASK.
 | 
			
		||||
 | 
			
		||||
READLINEMONAD HAS NO IO OR ANY ELSE BUILTIN; IT GETS LINE BY CREATE FUNCTION
 | 
			
		||||
WHICH TAKES LINE TO CONTINUU EXECUTION.  AGAIN AND AGAIN!  LINE CAN COME FROM
 | 
			
		||||
ANYTHIN.
 | 
			
		||||
 | 
			
		||||
EXAMPLE FOR USING RESULT!
 | 
			
		||||
#+BEGIN_SRC haskell
 | 
			
		||||
GETLINESFROMIO :: READLINEMONAD A -> IO A
 | 
			
		||||
GETLINESFROMIO (VALUE X) = RETURN X
 | 
			
		||||
GETLINESFROMIO (GETLINE F) = DO
 | 
			
		||||
  S <- GETLINE
 | 
			
		||||
  GETLINESFROMIO $ F S
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
U SEE WAT GOIN ON DERE!  IN OUR LEXER WE NAMELI USED
 | 
			
		||||
#+BEGIN_SRC haskell
 | 
			
		||||
GETLINE VALUE
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
TO GET LINE (BECAUSE FITS WITH CLEVER MONAD!)
 | 
			
		||||
 | 
			
		||||
*NICE-O!*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
** CODE IN QUSTION
 | 
			
		||||
 | 
			
		||||
LOOKIE HER FOR FULL DETAILS (ALTHOU WITH NO FULL CAPS):
 | 
			
		||||
[[https://raw.github.com/HIPERFIT/L0Language/master/src/Language/L0/Parser/Parser.y][HTTPS://RARRW.GITHUB.COM/HIPERFIT/L0LANGUAGE/MASTER/SRC/LANGUAGE/L0/PARSER/PARSER.Y]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
** CONCLUSION
 | 
			
		||||
 | 
			
		||||
#+caption: TRU STORY
 | 
			
		||||
#&img;url=MEME8.PNG,float=center
 | 
			
		||||
 | 
			
		||||
#+caption: NOT ME
 | 
			
		||||
#&img;url=MEME9.PNG,float=center
 | 
			
		||||
 | 
			
		||||
THIS IS ENTRELY OBJECTIVE.
 | 
			
		||||
 | 
			
		||||
THIS IS ENTIREY OBJECTIVE.
 | 
			
		||||
 | 
			
		||||
THIS IS ENTIRLY OBJECTIVE.
 | 
			
		||||