[英]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列表是否包含從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_
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.