我试图检查两个列表是否具有相等的元素。
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")
我完全迷路了,代码无法编译。
您可以按
如下方式根据intersect
和null
来定义此函数:
compareList :: (Eq a) => [a] -> [a] -> Bool
compareList a = not . null . intersect a
现场演示
您的代码未编译,因为:
- 您在
result
的定义中有一个奇怪的缩进 -
list1
和list2
未在result
中定义 -
putStrnLn
不存在;你可能的意思是putStrLn
- 你在
main
中调用compareList
,它返回Bool
,而不是IO ()
- 您需要在
compareList
和result
中添加(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