Di recente ho avuto il piacere di scrivere un programma Haskell in grado di rilevare se l' NegativeLiteralsestensione era attiva. Ho pensato a quanto segue:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Questo verrà stampato Truenormalmente e Falsealtrimenti.
Ora mi sono divertito così tanto a estendere la sfida a tutti voi. Quali altre estensioni di lingua Haskell puoi decifrare?
Regole
Per decifrare una determinata estensione del linguaggio è necessario scrivere un programma Haskell che compili sia con che senza l'estensione del linguaggio (gli avvisi vanno bene) e genera due differenti valori non di errore quando eseguito con l'estensione del linguaggio e disattivato (aggiungendo il Noprefisso a l'estensione della lingua). In questo modo il codice sopra potrebbe essere abbreviato in solo:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
quale stampa 1e -1.
Qualsiasi metodo utilizzato per decodificare un'estensione deve essere specifico per tale estensione. Ci possono essere modi per rilevare arbitrariamente quali flag del compilatore o LanguageExtensions sono abilitate, se così non sono consentiti tali metodi. È possibile abilitare estensioni di lingua aggiuntive o modificare l'ottimizzazione del compilatore utilizzando gratuitamente -Oil conteggio dei byte.
Estensioni di lingua
Non si può rompere qualsiasi estensione linguaggio che non ha una Nocontroparte (ad esempio Haskell98, Haskell2010, Unsafe, Trustworthy, Safe) perché questi non rientrano nei termini di cui sopra. Ogni altra estensione linguistica è un gioco equo.
punteggio
Ti verrà assegnato un punto per ogni estensione di lingua che sei la prima persona a decifrare e un punto aggiuntivo per ogni estensione di lingua per cui hai il crack più breve (misurato in byte). Per il secondo punto i legami verranno interrotti a favore di precedenti invii. Il punteggio più alto è migliore
Non sarai in grado di segnare un punto per il primo invio NegativeLiteralso QuasiQuotesperché li ho già decifrati e li ho inclusi nel corpo del post. Sarai comunque in grado di segnare un punto per il crack più breve di ognuno di questi. Ecco il mio crack diQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentationper ovvi motivi
Wait, what language extension is this?qualcosa di completamente diverso?
RelaxedPolyRec, per un compilatore abbastanza antico da supportare effettivamente lo spegnimento. (L'opzione è rimasta in giro, con la documentazione, per alcuni anni dopo aver smesso di fare qualsiasi cosa.)