Di recente ho avuto il piacere di scrivere un programma Haskell in grado di rilevare se l' NegativeLiterals
estensione 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 True
normalmente e False
altrimenti.
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 No
prefisso 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 1
e -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 -O
il conteggio dei byte.
Estensioni di lingua
Non si può rompere qualsiasi estensione linguaggio che non ha una No
controparte (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 NegativeLiterals
o QuasiQuotes
perché 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<-""] -- |]
NondecreasingIndentation
per 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.)