Ostatnio miałem przyjemność napisać program Haskell, który mógłby wykryć, czy NegativeLiteralsrozszerzenie 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 Truenormalnie i Falseinaczej.
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 Noprefiksu 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 1i -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 -Obez żadnych opłat do liczby bajtów.
Rozszerzenia językowe
Nie można złamać każde rozszerzenie języka, które nie mają Noodpowiednika (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 NegativeLiteralslub QuasiQuotesdlatego, ż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<-""] -- |]
NondecreasingIndentationz 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ć).