Récemment, j'ai eu le plaisir d'écrire un programme Haskell capable de détecter si l' NegativeLiterals
extension était activée. Je suis venu avec ce qui suit:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Cela imprimera True
normalement et False
sinon.
Maintenant, je me suis tellement amusé à faire que je vous lance un défi à tous. Quelles autres extensions de langage Haskell pouvez-vous craquer?
Règles
Pour déchiffrer une extension de langue particulière, vous devez écrire un programme Haskell qui compile à la fois avec et sans extension de langue (les avertissements conviennent) et génère deux valeurs différentes sans erreur lorsqu’elle est exécutée avec l’extension de langue et désactivée (en ajoutant le No
préfixe à l'extension de langue). De cette façon, le code ci-dessus pourrait être réduit à seulement:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
qui imprime 1
et -1
.
Toute méthode utilisée pour craquer une extension doit être spécifique à cette extension. Il peut exister des moyens de détecter arbitrairement quels indicateurs du compilateur ou LanguageExtensions sont activés, si de telles méthodes ne sont pas autorisées. Vous pouvez activer des extensions de langue supplémentaires ou modifier l'optimisation du compilateur en utilisant -O
gratuitement le nombre d'octets.
Extensions de langue
Vous ne pouvez pas casser toute extension de langage qui ne dispose pas d' une No
contrepartie (par exemple Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
) car ceux - ci ne tombent pas dans les conditions décrites ci - dessus. Toute autre extension linguistique est un jeu équitable.
Notation
Vous recevrez un point pour chaque extension de langue que vous êtes la première personne à craquer et un point supplémentaire pour chaque extension de langue pour laquelle vous avez la fissure la plus courte (mesurée en octets). Pour le deuxième point, les liens seront brisés en faveur des soumissions précédentes. Plus le score est élevé, mieux c'est
Vous ne serez pas en mesure de marquer un point pour la première soumission NegativeLiterals
ou QuasiQuotes
parce que je les ai déjà craquées et les ai incluses dans le corps du message. Vous pourrez cependant marquer un point pour la fissure la plus courte de chacune d’elles. Voici ma fente deQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
pour des raisons évidentes
Wait, what language extension is this?
ou quelque chose de complètement différent.
RelaxedPolyRec
, pour un compilateur assez ancien pour réellement soutenir le mettre hors tension. (L'option a traîné, avec documentation, pendant quelques années après avoir cessé de faire quoi que ce soit.)