检查 2 个列表是否有任何相等元素 Haskell



我试图检查两个列表是否具有相等的元素。

Example : 
List1 = ["John", "Thomas", "Sinclair", "Marie"]
List2 = ["Philip", "Albert", "Maria"]

结果应该是假的。

但如果是这样的:

List3 = ["John", "Thomas", "Sinclair", "Marie"]
List4 = ["Philip", "Albert", "Marie", "Edward"]

结果应该是真的,list3 e list4 有相同的,"Marie"。

我的代码 :

import qualified Data.Text    as Text
import qualified Data.Text.IO as Text
main = do
    list1 <- fmap Text.lines (Text.readFile "file1.txt")
    list2 <- fmap Text.lines (Text.readFile "file.txt")
    compareList list1 list2
compareList (x:xs) ys | elem x ys = True
                      |otherwise = compareList xs ys
result = 
if ((compareList list1 list2) == True)
       then putStrnLn ( " They sare elements")
          else
             putStrnLn ("They don't share elements")

我完全迷路了,代码无法编译。

您可以按

如下方式根据intersectnull来定义此函数:

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

现场演示

您的代码未编译,因为:

  1. 您在result的定义中有一个奇怪的缩进
  2. list1list2未在result中定义
  3. putStrnLn不存在;你可能的意思是putStrLn
  4. 你在 main 中调用 compareList ,它返回 Bool ,而不是IO ()
  5. 您需要在compareListresult中添加(Eq a) =>约束

如果您遵循这些建议,您将获得:

compareList :: (Eq a) => [a] -> [a] -> Bool
compareList [] _ = False
compareList (x:xs) ys 
    | elem x ys = True
    | otherwise  = compareList xs ys
result :: (Eq a) => [a] -> [a] -> IO ()
result list1 list2 = 
    if (compareList list1 list2)
        then putStrLn ("They share elements")
        else putStrLn ("They don't share elements")

现场演示

如果没有显式递归,你可以使用它

compareList :: (Eq a) => [a] -> [a] -> Bool
compareList xs ys = foldl (acc x -> x `elem` ys || acc) False xs

相关内容

最新更新