Cons在这个功能中做了什么?

jfi*_*isk 5 sml lazylist

Cons()在函数定义中,我对函数的作用感到困惑.

在此输入图像描述

Seb*_*olm 8

什么Stream代表是懒惰和潜在的无限名单.由于SML很渴望,这需要以略微迂回的方式完成.

我们先来看看普通列表的工作原理:

datatype 'a list = [] | :: of 'a * 'a list
Run Code Online (Sandbox Code Playgroud)

缺点包括两部分:

  • 列表中的第一个元素
  • 列表的其余部分

在惰性列表中,它非常相似.

datatype 'a Stream = Nil | Cons of 'a * (unit -> 'a Stream) 
Run Code Online (Sandbox Code Playgroud)

这里的缺点包括以下内容:

  • 列表中的第一个元素
  • 在计算时生成列表其余部分的函数()

所以,你可以看到原理大致相同,虽然有点难以使用.

我们来看一个示例列表:

fun succ n = Cons (n, fn () => succ (n+1))
val naturals = succ 0
Run Code Online (Sandbox Code Playgroud)

这会产生什么?我们来看看吧.

naturals被定义为succ 0,而后者被定义为Cons(0, fn () => succ 1).从中我们可以看到列表中的第一个元素是0.

现在让我们更进一步.我们评估fn () => succ 1,我们的第二部分Cons,上(),其产生succ 1,这又是Cons(1, fn () => succ 2).现在我们可以看到列表中的第二个元素是1.

如果我们重复这个过程,我们得到列表代表无限列表[0, 1, 2, ...].

您也可以尝试这样做

val firstnats = take 10 naturals;
Run Code Online (Sandbox Code Playgroud)

并看到你得到了什么.