在定义(所有)斐波那契数序列(以 SML/NJ 为单位)时出错



这是我的代码:

val fibs =
let
val rec fibs_help =
fn(n, next) => Cons(n, (fn()=>fibs_help(next, n+next)) )
in
fibs_help(0, 1)
end;
val list = fibs(10)

这是错误:

错误:未绑定变量或构造函数:缺点

错误消息引用缺少的数据类型构造函数Cons。它丢失了,因为您在提到的代码中没有数据类型声明。您可能缺少如下所示的行:

datatype 'a seq = Cons of 'a * (unit -> 'a seq)

如果在代码顶部插入该声明,则会收到一条新的错误消息:

! val list = fibs(10)
!            ^^^^
! Type clash: expression of type
!   int seq
! cannot have type
!   'a -> 'b

您收到此错误是因为您将fibs定义为整数序列,但在最后一行中,您将fibs称为一个函数,该函数可能采用您希望从该序列中提取的许多元素。序列的定义没有错。以下是我如何格式化代码的第一部分:

val fibs =
let fun fibs_help (n, next) = Cons (n, fn () => fibs_help (next, n+next))
in fibs_help(0, 1)
end

为了从这个无限序列中提取具体数量的元素,例如有限列表需要更多的工作。编写一个函数take (i, s),生成序列s的前i元素的列表:

fun take (0, ...) = ...
| take (i, Cons (n, subseq_f)) = ...

基本情况是当您想要来自任何序列的零元素列表时。考虑是否需要/什么需要在输入序列上进行模式匹配,以及这种微不足道的情况的结果是什么。递归情况是当您想要来自任何序列的一个或多个元素的列表时;通过在结果中包含n的一个元素来做到这一点,并使用takeisubseq_f来解决结构相同但大小较小的问题。

一旦这个函数工作,你可以使用它来获取十个元素的列表:

val ten_first = take (10, fibs)

最新更新