Recentemente, tive o prazer de escrever um programa Haskell que pudesse detectar se a NegativeLiterals
extensão estava envolvida. Eu vim com o seguinte:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Isso será impresso True
normalmente e False
caso contrário.
Agora eu me diverti muito fazendo isso, estou estendendo o desafio para todos vocês. Quais outras extensões de idioma Haskell você pode quebrar?
Regras
Para quebrar uma extensão de idioma específica, você deve escrever um programa Haskell que compila com e sem a extensão de idioma (os avisos são bons) e gera dois valores diferentes de erro quando executados com a extensão de idioma e desativados (adicionando o No
prefixo a a extensão do idioma). Dessa maneira, o código acima pode ser reduzido para apenas:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
que imprime 1
e -1
.
Qualquer método usado para quebrar uma extensão deve ser específico a essa extensão. Pode haver maneiras de detectar arbitrariamente quais sinalizadores do compilador ou LanguageExtensions estão habilitados, se esses métodos não forem permitidos. Você pode ativar extensões de idioma adicionais ou alterar a otimização do compilador usando -O
sem nenhum custo a sua contagem de bytes.
Extensões de idioma
Você não pode quebrar qualquer extensão de linguagem que não tem uma No
contrapartida (por exemplo Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
) porque estas não se enquadram nos termos descritos acima. Qualquer outra extensão de idioma é um jogo justo.
Pontuação
Você receberá um ponto por cada extensão de idioma que você é a primeira pessoa a quebrar e um ponto adicional por cada extensão de idioma para a qual você tem o menor crack (medido em bytes). Para o segundo ponto, os laços serão quebrados em favor de envios anteriores. Maior pontuação é melhor
Você não poderá marcar um ponto para a primeira submissão NegativeLiterals
ou QuasiQuotes
porque eu já os decifrei e os incluí no corpo da postagem. No entanto, você será capaz de marcar um ponto pelo menor crack de cada um deles. Aqui está o meu crackQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
, por razões óbvias
Wait, what language extension is this?
ou algo completamente diferente.
RelaxedPolyRec
, para um compilador antigo o suficiente para realmente suportá-lo. (A opção pendurados, com a documentação, para alguns anos depois de ter parado de fazer qualquer coisa.)