搜索列表以比较int并在SML中说出true或false

时间:2013-02-14 00:01:46

标签: list boolean int sml fibonacci

好的,所以总体目标是测试你输入的数字是否是斐波纳契数。例如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时它会给我一个数据类型错误不匹配。这让我疯狂请帮忙!

2 个答案:

答案 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。在您的情况下,nint。所以这里的问题是你试图将整数与整数列表进行比较。要消除这种情况,您需要编写一个函数来确定项目是否在列表中。

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