Recently I had the pleasure of writing a Haskell program that could detect if the NegativeLiterals
extension was engaged. I came up with the following:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
This will print True
normally and False
otherwise.
Now I had so much fun doing this I'm extending the challenge to all of you. What other Haskell language extensions can you crack?
Rules
To crack a particular language extension you must write a Haskell program that compiles both with and without the language extension (warnings are fine) and outputs two different non-error values when run with the language extension and it turned off (by adding the No
prefix to the language extension). In this way the code above could be shortened to just:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
which prints 1
and -1
.
Any method you use to crack a extension must be specific to that extension. There may be ways of arbitrarily detecting what compiler flags or LanguageExtensions are enabled, if so such methods are not allowed. You may enable additional language extensions or change the compiler optimization using -O
at no cost to your byte count.
Language extensions
You cannot crack any language extension that does not have a No
counterpart (e.g. Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
) because these do not fall under the terms outlined above. Every other language extension is fair game.
Scoring
You will be awarded one point for every language extensions you are the first person to crack and one additional point for every language extension for which you have the shortest (measured in bytes) crack. For the second point ties will be broken in favor of earlier submissions. Higher score is better
You will not be able to score a point for first submission on NegativeLiterals
or QuasiQuotes
because I have already cracked them and included them in the body of the post. You will however be able to score a point for the shortest crack of each of these. Here is my crack of QuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
for obvious reasons \$\endgroup\$RelaxedPolyRec
, for a compiler ancient enough to actually support turning it off. (The option hung around, with documentation, for some years after it stopped doing anything.) \$\endgroup\$