Kürzlich hatte ich das Vergnügen, ein Haskell-Programm zu schreiben, das erkennen konnte, ob die NegativeLiterals
Erweiterung belegt war. Ich habe mir folgendes ausgedacht:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Dies wird True
normal und False
ansonsten gedruckt .
Jetzt hatte ich so viel Spaß dabei, dass ich die Herausforderung auf euch alle ausdehne. Welche anderen Haskell-Spracherweiterungen können Sie knacken?
Regeln
Um eine bestimmte Spracherweiterung zu knacken, müssen Sie ein Haskell-Programm schreiben, das mit und ohne Spracherweiterung kompiliert (Warnungen sind in Ordnung) und zwei verschiedene fehlerfreie Werte ausgibt , wenn es mit der Spracherweiterung ausgeführt und deaktiviert wird (durch Hinzufügen des No
Präfixes zu) die Spracherweiterung). Auf diese Weise könnte der obige Code auf Folgendes gekürzt werden:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
welche druckt 1
und -1
.
Jede Methode, die Sie zum Knacken einer Erweiterung verwenden, muss für diese Erweiterung spezifisch sein. Es kann Möglichkeiten geben, willkürlich festzustellen, welche Compiler-Flags oder LanguageExtensions aktiviert sind, wenn solche Methoden nicht zulässig sind. Sie können zusätzliche Spracherweiterungen aktivieren oder die Compileroptimierung kostenlos -O
an Ihrer Byteanzahl ändern .
Spracherweiterungen
Sie können keine Spracherweiterung knacken, der keinen hat No
Gegenstück (zB Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
) , da diese nicht unter den oben genannten Bedingungen fallen. Jede andere Spracherweiterung ist Freiwild.
Wertung
Sie erhalten einen Punkt für jede Spracherweiterung, die Sie als erste Person knacken, und einen zusätzlichen Punkt für jede Spracherweiterung, für die Sie den kürzesten (gemessen in Byte) Riss haben. Für den zweiten Punkt werden die Bande zugunsten früherer Einreichungen unterbrochen. Eine höhere Punktzahl ist besser
Sie können keinen Punkt für die erste Einreichung erzielen, NegativeLiterals
oder QuasiQuotes
weil ich sie bereits geknackt und in den Inhalt des Beitrags aufgenommen habe. Sie werden jedoch in der Lage sein, einen Punkt für den kürzesten Riss von jedem von diesen zu erzielen. Hier ist mein Riss vonQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
aus offensichtlichen Gründen nicht enthalten
Wait, what language extension is this?
Oder etwas ganz anderes.
RelaxedPolyRec
, für einen Compiler, der alt genug ist, um das Ausschalten tatsächlich zu unterstützen. (Die Option blieb mit der Dokumentation einige Jahre lang bestehen, nachdem sie aufgehört hatte, irgendetwas zu tun.)