Haskell中[i..](如[0..])在条件中的替代写法咨询
关于Haskell中无限列表
[i..]的替代写法 嘿,刚入门Haskell的时候,确实会对这些看起来简洁到有点“魔法”的语法糖感兴趣~先插一句:你例子里写的a < [0..]其实有点小问题哦——Haskell里列表的<是按字典序比较的,但单个值和无限列表没法直接这么对比,我猜你大概率是想判断a是否属于这个无限自然数序列?或是单纯想找生成[i..]这类无限列表的其他方式?不管怎样,咱们来聊聊[i..]的几种替代写法:
用
enumFrom函数:其实[i..]本身就是enumFrom i的语法糖,因为列表属于Enum类型类的实例。比如enumFrom 0就完全等价于[0..],要是你在guard里想判断某个值是否在这个序列里,写aelemenumFrom 0和aelem[0..]效果完全一样。手动递归定义:如果想彻底搞懂无限列表的生成逻辑,完全可以自己写递归实现。比如自然数序列:
nat :: Integral a => [a] nat = 0 : map (+1) nat这个定义出来的
nat和[0..]语义完全一致,都是无限延伸的自然数列表,你可以直接把它当[0..]用。借助
iterate函数:iterate是生成无限列表的实用工具,它会反复把给定函数应用到前一个元素上,生成无限序列。比如iterate (+1) 0就会生成[0,1,2,3,...],和[0..]一模一样。如果以后需要自定义递推规则,比如生成偶数序列[0,2,4,...],用iterate (+2) 0会比[0,2..]更直观,当然对于自然数序列来说,它就是[0..]的完美替代。
要是你之前的a < [0..]是另有其他场景,也可以再补充细节,咱们再深入聊~
内容的提问来源于stack exchange,提问作者nurders04
相关产品推荐
相关产品推荐

