Нещодавно я мав задоволення написати програму 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
, оскільки компілятор досить старий, щоб насправді підтримувати його вимкнення. (Опція висіла з документацією протягом декількох років після того, як вона перестала робити щось.)