Нещодавно я мав задоволення написати програму Haskell, яка могла б виявити, чи було NegativeLiteralsрозширення задіяним. Я придумав таке:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Це надрукується Trueнормально та в Falseіншому випадку.
Тепер мені було так весело робити це, я поширюю виклик на всіх вас. Які ще розширення мови Haskell ви можете зламати?
Правила
Щоб зламати певне розширення мови, ви повинні написати програму Haskell, яка компілює як з мовним розширенням, так і без нього (попередження прекрасні) та виводить два різних значення помилок під час запуску з розширенням мови та його вимкнено (додавши Noпрефікс до розширення мови). Таким чином код вище можна було скоротити до просто:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
який друкує 1і -1.
Будь-який метод, який ви використовуєте для розтріскування розширення, повинен бути специфічним для цього розширення. Можливо, існують способи довільного визначення того, які прапорці компілятора або LanguageExtensions увімкнено, якщо так такі методи заборонені. Ви можете ввімкнути додаткові розширення мови або змінити оптимізацію компілятора, використовуючи -Oбезкоштовно вартість вашого байта.
Розширення мови
Ви не можете зламати будь-яке розширення мови, не мають Noаналогів (наприклад Haskell98, Haskell2010, Unsafe, Trustworthy, Safe) , тому що вони не потрапляють в відповідно до умов , викладених вище. Кожне інше розширення мови - це чесна гра.
Оцінка балів
Вам буде присвоєно один бал за кожне розширення мови, який ви є першою людиною, що зламається, і один додатковий бал за кожне розширення мови, для якого у вас найкоротший (вимірюється в байтах) тріск. Для другого пункту зв'язки будуть розірвані на користь попередніх подань. Вищий бал - кращий
Ви не зможете набрати бал за перше подання NegativeLiteralsабо QuasiQuotesтому, що я вже зламав їх і включив їх до основної публікації. Однак ви зможете набрати очко за найкоротший злом кожного з них. Ось моя тріщинаQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentationзрозумілих причин
Wait, what language extension is this?Або щось зовсім інше.
RelaxedPolyRec, оскільки компілятор досить старий, щоб насправді підтримувати його вимкнення. (Опція висіла з документацією протягом декількох років після того, як вона перестала робити щось.)