簡體   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