在 SML/NJ 中定义一系列(所有)斐波那契数列时出错
Getting error while defining a sequence of (all) Fibonacci numbers, in 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)
这是错误:
Error: unbound variable or constructor: 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)) = ...
基本情况是您需要来自任何序列的零元素列表。考虑 if/what 您需要对输入序列进行模式匹配,以及这个简单案例的结果是什么。递归情况是当您想要来自任何序列的一个或多个元素的列表时;通过在结果中包含一个元素 n
来解决这个问题,并使用 take
、i
和 subseq_f
.[= 解决结构相同但大小小一的问题25=]
一旦此函数生效,您就可以使用它来获取包含十个元素的列表:
val ten_first = take (10, fibs)
这是我的代码:
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)
这是错误:
Error: unbound variable or constructor: 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)) = ...
基本情况是您需要来自任何序列的零元素列表。考虑 if/what 您需要对输入序列进行模式匹配,以及这个简单案例的结果是什么。递归情况是当您想要来自任何序列的一个或多个元素的列表时;通过在结果中包含一个元素 n
来解决这个问题,并使用 take
、i
和 subseq_f
.[= 解决结构相同但大小小一的问题25=]
一旦此函数生效,您就可以使用它来获取包含十个元素的列表:
val ten_first = take (10, fibs)