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