为什么当a> b时[a..b]为空列表?

时间:2019-07-01 15:37:12

标签: haskell

如果我在Haskell控制台中输入import numpy as np import matplotlib.pyplot as plt %matplotlib inline from mpl_toolkits.mplot3d import Axes3D def param_surface(t): fig = plt.figure(figsize = (10, 10)) ax = fig.add_subplot(111, projection='3d') u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) x = axis_a(4 * t / 50) * np.outer(np.cos(u), np.sin(v)) y = axis_a(4 * t / 50) * np.outer(np.sin(u), np.sin(v)) z = axis_b(4 * t / 50) * np.outer(np.ones(np.size(u)), np.cos(v)) return(ax.plot_surface(x, y, z, rstride = 4, cstride = 4)) ,它将返回[5..1],而我希望是[]

通常,[5, 4, 3, 2, 1][a..b] = []。为什么?

1 个答案:

答案 0 :(得分:15)

该报告涵盖了详细信息。在Section 3.10中:

  

算术序列满足以下身份:

[ e1..e3 ]    =   enumFromTo e1 e3

Section 6.3.4中:

  

对于类型IntInteger,枚举函数具有以下含义:

     
      
  • 序列enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,…e3]。如果e1 > e3,则该列表为空。
  •   
     

对于FloatDoubleenumFrom族的语义由上述Int的规则给出,除了当元素大于e3 + i∕2代表正数i,或者当它们变得小于e3 + i∕2代表负数i时。

然后下一个问题是:“为什么要以这种方式指定报告?”。我认为答案是,对于数学家来说,这种选择是很自然的,大多数原始委员会在某种程度上都是如此。它还具有许多不错的属性:

  • 如果[x..y]具有 n 个值,则[x..y-1][x+1..y]具有 n-1 个值(在 n-1 ,减法会在0处饱和,这是 ahem 的自然选择)。
  • 检查特定元素是否在[x..y]范围内仅需要检查它是否大于x并小于y -您无需首先确定{{1 }}或x更大。
  • 它可以防止某些类的意外的一次性错误:如果您想在y之后使用下一个 n> = 0 元素,则可以编写{{1} }。如果选择其他规则,则x可能表示[x..x+n-1],如果[x..y]较小,则无法使用[y,y+1,...,x]语法创建空列表,因此没有统一的方法获取下一个 n 元素。人们将不得不编写更加繁琐的y;忘记写这张支票很容易。

如果您希望使用列表[_.._],可以通过指定明确的第二步来实现,如if n>0 then [x..x+n-1] else []所示。