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

在SML/NJ中定义(所有)斐波那契数序列时出错,sml,fibonacci,smlnj,unbound,Sml,Fibonacci,Smlnj,Unbound,这是我的密码: 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 错误消息指缺少数据类型构造函数,Cons。它丢失了,因为您在提到的代码中没有数据类型声明。您可能遗漏了一行,如下所示: dataty

这是我的密码:

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


错误消息指缺少数据类型构造函数,
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
,并使用
take
i
subseq\u f
解决结构相同但尺寸较小的问题

此函数工作后,您可以使用它获取包含十个元素的列表:

val ten_first = take (10, fibs)