Gần đây tôi rất vui khi viết một chương trình Haskell có thể phát hiện nếu NegativeLiterals
phần mở rộng được tham gia. Tôi đã đưa ra những điều sau đây:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
Điều này sẽ in True
bình thường và False
khác.
Bây giờ tôi đã có rất nhiều niềm vui khi làm điều này Tôi đang mở rộng thử thách cho tất cả các bạn. Những phần mở rộng ngôn ngữ Haskell khác bạn có thể crack?
Quy tắc
Để bẻ khóa một phần mở rộng ngôn ngữ cụ thể, bạn phải viết chương trình Haskell biên dịch cả có và không có phần mở rộng ngôn ngữ (cảnh báo là tốt) và đưa ra hai giá trị không lỗi khác nhau khi chạy với phần mở rộng ngôn ngữ và nó tắt (bằng cách thêm No
tiền tố vào phần mở rộng ngôn ngữ). Theo cách này, đoạn mã trên có thể được rút ngắn thành:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
mà in 1
và -1
.
Bất kỳ phương pháp nào bạn sử dụng để bẻ khóa một phần mở rộng phải cụ thể cho phần mở rộng đó. Có thể có các cách tự ý phát hiện cờ nào của trình biên dịch hoặc LanguageExtensions được bật, nếu vậy các phương thức đó không được phép. Bạn có thể kích hoạt các phần mở rộng ngôn ngữ bổ sung hoặc thay đổi tối ưu hóa trình biên dịch bằng cách sử dụng -O
miễn phí cho số byte của bạn.
Phần mở rộng ngôn ngữ
Bạn không thể crack bất kỳ phần mở rộng ngôn ngữ mà không có một No
đối tác (ví dụ Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
) vì những không thuộc các điều khoản nêu trên. Mỗi phần mở rộng ngôn ngữ khác là trò chơi công bằng.
Chấm điểm
Bạn sẽ được thưởng một điểm cho mỗi tiện ích mở rộng ngôn ngữ mà bạn là người đầu tiên bẻ khóa và một điểm bổ sung cho mỗi tiện ích mở rộng ngôn ngữ mà bạn có vết nứt ngắn nhất (tính bằng byte). Đối với các mối quan hệ điểm thứ hai sẽ được phá vỡ để ủng hộ đệ trình trước đó. Điểm cao hơn là tốt hơn
Bạn sẽ không thể ghi điểm cho lần gửi đầu tiên NegativeLiterals
hoặc QuasiQuotes
vì tôi đã bẻ khóa chúng và đưa chúng vào phần thân bài. Tuy nhiên, bạn sẽ có thể ghi một điểm cho vết nứt ngắn nhất trong số này. Đây là vết nứt của tôiQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
vì những lý do rõ ràng
Wait, what language extension is this?
Hoặc một cái gì đó hoàn toàn khác nhau.
RelaxedPolyRec
, vì một trình biên dịch đủ cổ xưa để thực sự hỗ trợ tắt nó đi. (Tùy chọn treo xung quanh, với tài liệu, trong một vài năm sau khi nó ngừng làm bất cứ điều gì.)