0

好的,所以总体目标是测试您输入的数字是否是斐波那契数。例如isfib(100) = false isfib(8) = true

这是我尝试过的:

    fun fib a b 

这会找到所有斐波那契数并将它们放在一个列表中。

    fun isfib(n) = 
    if n = fib 0 1 then true
    else false;

我希望它在列表中搜索 n 并返回true它是否存在或false不存在。

虽然它可以编译但无法让它工作,但每当我运行 isfib 时,它都会给我一个数据类型错误不匹配。这让我发疯,请帮忙!

4

2 回答 2

2

您的代码的问题是,当您打算将 a 作为输入时,类型签名isfib(n)期望int list作为输入并返回 a作为输出。这就是为什么它给出关于运营商不同意的错误消息的原因。即它期待一个但收到一个。booleanintint listint

您可以使用List.exists来检查从 生成的斐波那契数n中是否存在。listfib 0 1

fun isfib(n) = List.exists (fn x => x = n) (fib 0 1);

isfib(8);
val it = true : bool
isfib(100);
val it = false : bool
于 2013-02-14T02:08:22.497 回答
1

我建议注意函数的类型定义。

val fib = fn : int -> int -> int list
val isfib = fn : int list -> bool

根据它,isfib需要一个整数列表作为参数,但是您正在尝试传递一个整数。

你需要小心类型。ML 是隐式类型语言,但显式分配类型可以节省您的时间。

让我们用明确定义的类型重写你的程序:

fun fib (a:int,  b:int) =
  if b + a + b < 40000000
  then (a + b) :: fib (b, (a + b))
  else [a + b];

fun isfib (n: int) =
  if n = fib (0, 1) then true
  else false;

如果您尝试构建程序,编译器会将您指向实际导致问题的表达式:n = fib (0,1). 从函数fib定义可以看出,它返回int list. nint你的情况下。所以这里的问题是你试图将整数与整数列表进行比较。为了消除这种情况,您需要编写一个函数来确定项目是否在列表中。

PS您也可以使用结构中List.exists的函数List,但我建议先编写自己的函数。

于 2013-02-14T02:08:34.493 回答