【问题标题】:Searching a list to compare int and say true or false in SML搜索列表以比较 int 并在 SML 中说真或假
【发布时间】:2013-02-14 00:01:45
【问题描述】:
好的,所以总体目标是测试您输入的数字是否是斐波那契数。比如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 时,它都会给我一个数据类型错误不匹配。这让我发疯了,请帮忙!
【问题讨论】:
标签:
list
boolean
int
sml
fibonacci
【解决方案1】:
您的代码的问题是 isfib(n) 的类型签名期望 int list 作为输入,并在您打算将 int 作为输入时返回 boolean 作为输出。这就是为什么它给出关于运营商不同意的错误消息的原因。即它期待一个int list,但收到一个int。
您可以使用List.exists 来检查n 是否存在于从fib 0 1 生成的斐波那契数的list 中。
fun isfib(n) = List.exists (fn x => x = n) (fib 0 1);
isfib(8);
val it = true : bool
isfib(100);
val it = false : bool
【解决方案2】:
我建议注意你的函数的类型定义。
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。所以这里的问题是你试图将整数与整数列表进行比较。为了消除这种情况,您需要编写一个函数来确定项目是否在列表中。
附:您也可以使用List 结构中的List.exists 函数,但我建议您先编写自己的函数。