Recientemente tuve el placer de escribir un programa Haskell que podía detectar si la NegativeLiteralsextensió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á Truenormalmente y de Falseotra 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 Noprefijo 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 1y -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 -Osin costo alguno para el recuento de bytes.
Extensiones de idioma
No se puede romper cualquier extensión del lenguaje que no tiene una Nocontraparte (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 NegativeLiteralso QuasiQuotesporque 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<-""] -- |]
NondecreasingIndentationpor 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.)