如果我在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] = []
。为什么?
答案 0 :(得分:15)
该报告涵盖了详细信息。在Section 3.10中:
算术序列满足以下身份:
[ e1..e3 ] = enumFromTo e1 e3
对于类型
Int
和Integer
,枚举函数具有以下含义:
- 序列
enumFromTo e1 e3
是列表[e1,e1 + 1,e1 + 2,…e3]
。如果e1 > e3
,则该列表为空。对于
Float
和Double
,enumFrom
族的语义由上述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 []
所示。