繁体   English   中英

Haskell检查Int的列表是否完整

[英]Haskell Check if a list of Int's is complete

解释这个并不容易,但我会尝试。 我想我的方法与一些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

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

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

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

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

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

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

以下将检查提供的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.sort准备列表中实现真正的检查check_

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM