【问题标题】:Haskell-list confusionHaskell 列表混淆
【发布时间】:2015-01-30 04:25:26
【问题描述】:

要创建一个包含 5 个数字的列表,可以执行以下操作:

[1..5]

也可以从大到小开始:

[5,4..1]

但没有意义的是,如果你要这样创建一个列表,你会得到一个空列表:

[5..1]

是否有可能解释为什么最后一个 sn-p 返回一个空列表?就像上面第二个 sn-p 一样,为什么必须指定每个数字之间的间隔对我来说没有意义。

如果它从最低到最高运行,我认为让语言从最高到最低运行不会太难。 Haskell 不允许这种漏洞问题是否存在根本原因?

【问题讨论】:

  • 当限制不是(两者)恒定时,这很重要。 [0..n] 不会在 0 处自动改变方向时更容易使用。

标签: haskell


【解决方案1】:

[n..m] 列表枚举了这些数字 x,例如 n <= x && x <= m。如果m<n,则不存在这样的x,因此结果为空。

请注意,此约定有助于翻译惯用的命令式循环

// Does nothing if m<n
for (int x=n; x <= m ; x++) { ... }

可以变成

map (...) [n..m]   -- or foldr, or ...

甚至

forM_ [n..m] $ \x -> ...

此约定与其他一些语言共享,例如Python,其中range(n,m) 大致相当于[n..m-1]。确实,range(1,1) 是空的,还有range(1,0) 和range(1,-1) 等等。

【讨论】:

    【解决方案2】:

    从Wikibooks,算术序列被脱糖为:

    [1..5]   → enumFromTo 1 5
    [1,3..9] → enumFromThenTo 1 3 9
    [1..]    → enumFrom 1
    [1,3..]   → enumFromThen 1 3
    

    所以[5,4..1] 被脱糖为enumFromThenTo 5 4 1,但[5..1] 被脱糖为enumFromTo 5 1。

    您可以根据自己的数据类型定义它们。这些函数是Enum type-class 的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多