Recientemente tuve el placer de escribir un programa Haskell que podía detectar si la NegativeLiterals
extensión estaba activada. Se me ocurrió lo siguiente:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Esto se imprimirá True
normalmente y de False
otra manera.
Ahora me divertí tanto haciendo esto que estoy extendiendo el desafío a todos ustedes. ¿Qué otras extensiones de lenguaje Haskell puedes descifrar?
Reglas
Para descifrar una extensión de idioma en particular, debe escribir un programa Haskell que compile con y sin la extensión de idioma (las advertencias están bien) y genera dos valores diferentes sin errores cuando se ejecuta con la extensión de idioma y se apaga (agregando el No
prefijo a la extensión del lenguaje). De esta manera, el código anterior se podría acortar a solo:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
que imprime 1
y -1
.
Cualquier método que use para descifrar una extensión debe ser específico para esa extensión. Puede haber formas de detectar arbitrariamente qué indicadores del compilador o LanguageExtensions están habilitados, de ser así, dichos métodos no están permitidos. Puede habilitar extensiones de idioma adicionales o cambiar la optimización del compilador -O
sin costo alguno para el recuento de bytes.
Extensiones de idioma
No se puede romper cualquier extensión del lenguaje que no tiene una No
contraparte (por ejemplo Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
), ya que éstos no entran en los términos antes expuestos. Cualquier otra extensión de idioma es un juego justo.
Tanteo
Se le otorgará un punto por cada extensión de idioma que sea la primera persona en descifrar y un punto adicional por cada extensión de idioma para la que tenga la grieta más corta (medida en bytes). Para el segundo punto, los lazos se romperán a favor de las presentaciones anteriores. Mayor puntaje es mejor
No podrá obtener un punto para la primera presentación en NegativeLiterals
o QuasiQuotes
porque ya los descifré y los incluí en el cuerpo de la publicación. Sin embargo, podrá obtener un punto por el crack más corto de cada uno de estos. Aquí está mi crack deQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
por razones obvias
Wait, what language extension is this?
O algo completamente diferente?
RelaxedPolyRec
, para una lo suficientemente antigua compilador que realmente apoyar apagarlo. (La opción estuvo pendiente, con documentación, durante algunos años después de que dejó de hacer nada.)