解释这个并不容易,但我会尝试。我想我的方法与某些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
答案 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列表是否包含1
到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_
中实施的实际检查准备列表。