[英]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
)。 (Eq a)
約束中有一個錯字。 if
語句向后。 Python具有結構x if (condition) else y
,但是Haskell卻使用if condition then x else y
。 另外,盡管這沒錯,但是當x
和y
為True
和False
時,則不需要它,因為整個結果的總和為(condition)
。 因此,代碼應為:
empty_intersection :: (Eq a) => [a] -> [a] -> Bool
empty_intersection as bs = null [x | x <- as, x `elem` bs]
您的代碼將無法編譯,因為列表不能為布爾值,因此您不能將其包含在if語句中。 但是,有像all
, any
和null
這樣的函數,它們可以獲取列表並返回布爾值。
只需使用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.