Baru-baru ini saya merasa senang menulis sebuah program Haskell yang dapat mendeteksi jika NegativeLiteralsekstensi terlibat. Saya datang dengan yang berikut:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Ini akan mencetak secara Truenormal dan Falsesebaliknya.
Sekarang aku sangat senang melakukan ini. Aku memperluas tantangan untuk kalian semua. Ekstensi bahasa Haskell apa lagi yang bisa Anda crack?
Aturan
Untuk memecahkan ekstensi bahasa tertentu, Anda harus menulis program Haskell yang mengkompilasi dengan dan tanpa ekstensi bahasa (peringatan baik-baik saja) dan menghasilkan dua nilai non-kesalahan yang berbeda ketika dijalankan dengan ekstensi bahasa dan dimatikan (dengan menambahkan Noawalan ke ekstensi bahasa). Dengan cara ini kode di atas dapat disingkat menjadi hanya:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
yang mencetak 1dan -1.
Metode apa pun yang Anda gunakan untuk memecahkan ekstensi harus spesifik untuk ekstensi itu. Mungkin ada cara mendeteksi sewenang-wenang apa bendera compiler atau LanguageExtensions diaktifkan, jika demikian metode tersebut tidak diperbolehkan. Anda dapat mengaktifkan ekstensi bahasa tambahan atau mengubah pengoptimalan kompiler menggunakan -Otanpa biaya ke jumlah byte Anda.
Ekstensi bahasa
Anda tidak dapat retak ekstensi bahasa yang tidak memiliki Norekan (misalnya Haskell98, Haskell2010, Unsafe, Trustworthy, Safe) karena ini tidak jatuh di bawah ketentuan yang diuraikan di atas. Setiap ekstensi bahasa lainnya adalah permainan yang adil.
Mencetak gol
Anda akan diberikan satu poin untuk setiap ekstensi bahasa Anda adalah orang pertama yang diretas dan satu poin tambahan untuk setiap ekstensi bahasa yang Anda miliki celahnya yang terpendek (diukur dalam byte). Untuk poin kedua, ikatan akan diputus untuk pengajuan sebelumnya. Skor yang lebih tinggi lebih baik
Anda tidak akan dapat mencetak poin untuk pengiriman pertama pada NegativeLiteralsatau QuasiQuoteskarena saya telah memecahkannya dan memasukkannya ke dalam tubuh pos. Namun Anda akan dapat mencetak poin untuk celah terpendek dari masing-masing. Inilah celah sayaQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentationkarena alasan yang jelas
Wait, what language extension is this?Atau sesuatu yang sama sekali berbeda.
RelaxedPolyRec, untuk kompiler yang cukup kuno untuk benar - benar mendukung mematikannya. (Pilihan ada di sana, dengan dokumentasi, selama beberapa tahun setelah itu berhenti melakukan apa pun.)