无限列表容量是否构建在`Ord`类型类中,还是haskell定义数字的乘积?

Ath*_*ark 2 haskell lazy-evaluation recursive-datastructures

我试图围绕着如何获得无限列表来解决这个问题...这是我的路障:

您有一个类型列表A,并A实现Ord类型类.您可以像这样描述一系列有序元素(例如,intergers):

[1..6]
Run Code Online (Sandbox Code Playgroud)

这相当于......

Cons 1 (Cons 2 (Cons 3 (Cons 4 (Cons 5 (Cons 6 (Empty))))))
Run Code Online (Sandbox Code Playgroud)

haskell如何知道如何构建无限列表?haskell能够创建支持的任何数据类型的无限列表Ord吗?

J. *_*son 6

Haskell"创建"无限列表,因为它不需要创建任何元素.例如,让我们走过的扩张head [1..],导致1在Haskell和严格语言的无限循环.

head [1..]

===                                 [expand `head`, literally 
                                     just inline the definition]
case [1..] of
  []        -> error "empty list"
  (x : xs)  -> x

===                                 [evaluate [1..] one step,
                                     check if it matches the case]
case 1:[2..] of
  []        -> error "empty list"
  (x : xs)  -> x

===                                 [it does!]

(1 : [2..]) -> 1

===                                 [fin]

1
Run Code Online (Sandbox Code Playgroud)

请注意,与大多数语言相比,这是非常落后的,这些语言首先是攻击定义[1..]而不是攻击head.

你可以[x..]不为类型类中的任何类型编写Ord(这只能让我们说出两个东西是否比另一个更大或更小),而是在Enum类型类中[x..]转换为enumFrom xwhere enumFrom :: Enum a => a -> [a].