unhappy rant
After Width: | Height: | Size: 396 KiB |
After Width: | Height: | Size: 609 KiB |
After Width: | Height: | Size: 359 KiB |
After Width: | Height: | Size: 321 KiB |
After Width: | Height: | Size: 460 KiB |
After Width: | Height: | Size: 227 KiB |
After Width: | Height: | Size: 437 KiB |
After Width: | Height: | Size: 586 KiB |
After Width: | Height: | Size: 426 KiB |
After Width: | Height: | Size: 473 KiB |
After Width: | Height: | Size: 1.8 KiB |
|
@ -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.
|