簡體   English   中英

如何使用Haskell檢查列表是否為空

[英]How to check for an empty intersection of lists with Haskell

以下是我嘗試創建然后檢查Haskell中兩個列表的交集的代碼嘗試。 有人可以幫我讓它運行嗎?

empty_intersection :: (Eq a_ => [a] -> [a] -> Bool
empty_intersection as bs = (true if ([x | x <- as, x  `elem` bs) else false)

您基本上在這里有了正確的想法,這里只有幾個小問題:

  • 您尚未關閉列表理解的方括號,這會導致解析錯誤。
  • if不能直接使用列表,因為if僅適用於Bool類型的值。 您可能會想到其他一些語言,其中且僅當列表/數組為非空時才將列表/數組視為“真”-但Haskell不會自動進行類型轉換,因此您必須明確檢查列表是否為非空。 做到這一點的最好和最簡單的方法是使用null函數(該函數接受一個列表,如果為空則返回True ,否則返回False )。
  • 正如@Bergi所指出的(我最初是想念的),您的(Eq a)約束中有一個錯字。
  • if語句向后。 Python具有結構x if (condition) else y ,但是Haskell卻使用if condition then x else y 另外,盡管這沒錯,但是當xyTrueFalse時,則不需要它,因為整個結果的總和為(condition)

因此,代碼應為:

empty_intersection :: (Eq a) => [a] -> [a] -> Bool
empty_intersection as bs = null [x | x <- as, x  `elem` bs]

問題

您的代碼將無法編譯,因為列表不能為布爾值,因此您不能將其包含在if語句中。 但是,有像allanynull這樣的函數,它們可以獲取列表並返回布爾值。

只需使用Prelude函數null :: [a] -> Bool ,如果您的列表為空,則返回true。 (還請注意,@ Bergi說您的類型約束中有錯別字)

empty_intersection :: (Eq a => [a] -> [a] -> Bool
empty_intersection as bs = null [x | x <- as, x  `elem` bs]

更好

另外,由於這是關於集並集和交集的第二個問題,請注意,有一個用於處理有序集的庫Data.Set ,它具有更高效的交集,並集,隸屬關系, Data.Set功能。

您可以使用intersect

empty_intersection :: (Eq a) => [a] -> [a] -> Bool
empty_intersection = null . intersect

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM