Baru-baru ini saya merasa senang menulis sebuah program Haskell yang dapat mendeteksi jika NegativeLiterals
ekstensi 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 True
normal dan False
sebaliknya.
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 No
awalan 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 1
dan -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 -O
tanpa biaya ke jumlah byte Anda.
Ekstensi bahasa
Anda tidak dapat retak ekstensi bahasa yang tidak memiliki No
rekan (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 NegativeLiterals
atau QuasiQuotes
karena 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<-""] -- |]
NondecreasingIndentation
karena 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.)