最近,我很高兴编写了一个Haskell程序,该程序可以检测到NegativeLiterals
扩展是否被使用。我想出了以下几点:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
它将True
正常打印,False
否则打印。
现在,我的工作非常有趣,我将挑战扩展到了所有人。您还可以破解其他哪些Haskell语言扩展?
规则
要破解特定的语言扩展,您必须编写一个Haskell程序,该程序可以同时编译有无语言扩展(警告很好),并在使用该语言扩展运行并关闭时输出两个不同的非错误值(通过将No
前缀添加到语言扩展)。这样,上面的代码可以简化为:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
打印1
和-1
。
您用来破解扩展程序的任何方法都必须特定于该扩展程序。如果不允许的话,可能有一些方法可以任意检测启用了哪些编译器标志或LanguageExtensions。您可以启用其他语言扩展或更改编译器优化-O
,而无需花费任何字节数。
语言扩展
你无法破解任何语言扩展,没有一个No
对应物(例如Haskell98
,Haskell2010
,Unsafe
,Trustworthy
,Safe
),因为这些不属于上文所列的条款。所有其他语言扩展都是公平的游戏。
计分
您是第一个破解的人,每种语言扩展都会获得一分,而您破解最短(以字节为单位)的每种语言扩展将获得一分。对于第二点,将打破联系以支持较早的提交。分数越高越好
您将无法为首次提交打分,NegativeLiterals
或者QuasiQuotes
因为我已经破解了它们并将其包含在帖子正文中。但是,您将能够在每一个裂缝中得分最短的地方得分。这是我的裂缝QuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
由于明显的原因,我的上述评论未包括在内
Wait, what language extension is this?
或者完全不同的东西。
RelaxedPolyRec
,因为一个足够古老的编译器实际上可以支持将其关闭。(该选项在停止执行任何操作后,随文档一起徘徊了数年。)