Haskell检查Int的列表是否完整

时间:2012-12-20 18:29:48

标签: list haskell

解释这个并不容易,但我会尝试。我想我的方法与某些C混淆了,但是在这里:

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

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

main> check 1 [1,2,3,4]
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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

您的函数无法编译,因为您的类型约束大于您声明的类型约束。您说a只需要是Eq的实例 - 但随后您向其添加内容,这需要它是Num的实例。使用该函数的方式对于您声明的签名也没有意义 - check [1,2,3,4]在您的示例中是Bool,但在您给出的代码中将是Eq a => [[a]] -> Bool(如果它首先编译。)

你只需要这个就可以使用整数吗?如果没有,举一个例子说明在这种情况下“完整”是什么意思。如果是,那么他们总是从1开始吗?

答案 2 :(得分:0)

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

以下内容将检查提供的n Int列表是否包含1n的所有值:

  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.sortcheck_中实施的实际检查准备列表。