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

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

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多