Ostatnio miałem przyjemność napisać program Haskell, który mógłby wykryć, czy NegativeLiterals
rozszerzenie jest włączone. Wymyśliłem następujące:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Zostanie wydrukowany True
normalnie i False
inaczej.
Teraz miałem tyle radości, robiąc to, że rozszerzam wyzwanie na was wszystkich. Jakie inne rozszerzenia języka Haskell możesz złamać?
Zasady
Aby złamać określone rozszerzenie językowe, musisz napisać program Haskell, który kompiluje zarówno z rozszerzeniem językowym, jak i bez niego (ostrzeżenia są w porządku) i wyświetla dwie różne wartości inne niż błędy po uruchomieniu z rozszerzeniem językowym i wyłączeniu go (poprzez dodanie No
prefiksu do rozszerzenie języka). W ten sposób powyższy kod może zostać skrócony do:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
który drukuje 1
i -1
.
Każda metoda używana do złamania rozszerzenia musi być specyficzna dla tego rozszerzenia. Mogą istnieć sposoby arbitralnego wykrywania, które flagi kompilatora lub rozszerzenia językowe są włączone, jeśli takie metody nie są dozwolone. Możesz włączyć dodatkowe rozszerzenia językowe lub zmienić optymalizację kompilatora, używając -O
bez żadnych opłat do liczby bajtów.
Rozszerzenia językowe
Nie można złamać każde rozszerzenie języka, które nie mają No
odpowiednika (np Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
), ponieważ te nie są objęte warunkami opisanymi powyżej. Każde inne rozszerzenie języka jest uczciwą grą.
Punktacja
Otrzymasz jeden punkt za każde rozszerzenie językowe, które złamałeś jako pierwszy, i jeden dodatkowy punkt za każde rozszerzenie językowe, dla którego masz najkrótsze (mierzone w bajtach) pęknięcie. W przypadku drugiego punktu więzi zostaną zerwane na korzyść wcześniejszych wniosków. Wyższy wynik jest lepszy
Nie będziesz w stanie zdobyć punktu za pierwsze zgłoszenie NegativeLiterals
lub QuasiQuotes
dlatego, że już je złamałem i umieściłem w treści postu. Będziesz jednak mógł zdobyć punkt za najkrótsze pęknięcie każdego z nich. Oto mój trzaskQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
z oczywistych powodów
Wait, what language extension is this?
może coś zupełnie innego.
RelaxedPolyRec
, ponieważ kompilator na tyle starożytny, że rzeczywiście obsługuje jego wyłączenie. (Ta opcja pozostała z dokumentacją przez kilka lat po tym, jak przestała coś robić).