好的,所以总体目标是测试你输入的数字是否是斐波纳契数。例如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时它会给我一个数据类型错误不匹配。这让我疯狂请帮忙!
答案 0 :(得分:2)
您的代码存在的问题是,isfib(n)
的类型签名期望int list
作为输入,并在您打算boolean
作为输入时返回int
作为输出。这就是为什么它给出了关于运营商不同意的错误消息。即它期待int list
但收到int
。
您可以使用List.exists
检查n
生成的斐波那契数字list
中是否存在fib 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
答案 1 :(得分: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
。在您的情况下,n
为int
。所以这里的问题是你试图将整数与整数列表进行比较。要消除这种情况,您需要编写一个函数来确定项目是否在列表中。
P.S。您也可以使用List.exists
结构中的List
函数,但我建议您先编写自己的函数。