3

很难解释这一点,但我会尝试。我想我把我的方法和一些 C 混淆了,但它是这样的:

我想检查一个列表是否完整,如下所示:

main> check 1 [1,3,4,5]
False

main> check 1 [1,2,3,4]
True

它是一个有限列表,并且不必对列表进行排序。但在列表中,最有可能错过的数字是 True。在第一种情况下,它是数字 2。

这是我的版本,但它甚至没有编译。

check :: Eq a => a -> [a] -> Bool
check n [] = False
check n x | n/=(maximum x) = elem n x && check (n+1) x
          | otherwise = False
4

3 回答 3

4

因此,如果我理解正确,您需要检查列表中的所有元素在排序时是否形成一个没有间隙的序列。这是一种方法:

noGaps :: (Enum a, Ord a) => [a] -> Bool
noGaps xs = all (`elem` xs) [minimum xs .. maximum xs]

[minimum xs .. maximum xs]创建从最低到最高值的所有值的顺序列表。然后您只需检查它们是否是all elem原始列表的条目。

于 2012-12-20T18:49:30.423 回答
3

您的函数无法编译,因为您的类型约束大于您声明的约束。你说a那只需要是Eq- 的一个实例,但是你向它添加了一些东西,这要求它是一个Num. 您使用该函数的方式对于您声明的签名也没有意义 -在您的示例中check [1,2,3,4]是 a Bool,但在您提供的代码中Eq a => [[a]] -> Bool(如果它首先编译)。

你只需要这个来处理整数吗?如果不是,请举例说明在这种情况下“完成”是什么意思。如果是,那么它们总是以 1 开头吗?

于 2012-12-20T18:49:54.230 回答
0

这是对该问题的另一种看法,它使用了一个适用于排序列表的函数,并将其与排序输入一起使用。

以下将检查提供的nInt 列表是否包含从1to的所有值n

  check :: (Num a, Ord a) => [a] -> Bool

  import List

  check l = check_ 1 (sort l)
     where check_ n [] = True
                 check_ n [x] = n == x
                 check_ n (x:y:xs) = (x+1)==y && check_ (n+1) (y:xs)

请注意使用List.sort来为在 中实现的真实检查准备列表check_

于 2012-12-20T19:20:37.700 回答