我正在尝试在Haskell中编写一个函数,它接受两个列表并返回两个共同的元素
我使用以下方法,但它给出了一个解析错误,并说要将<-
语句放在do块中。如何在do块中实现条件?
我正在尝试:
present (xs)(ys) = concat[ x | x <- xs && x <-ys ]
答案 0 :(得分:3)
<-
并未说“x
在xs
”;它说“从x
”开始xs
。它不是一个布尔表达式,您可以使用&&
与其他人结合,但这是列表推导的部分语法。如果你想使用列表理解,它将是
present xs ys = [x | x <- xs, x `elem` ys]
您从xs
获取每个元素,但只有在ys
的元素中才使用它。您不需要concat
。
请注意,这需要{em> xs
和ys
共有的所有元素(即,它是设置的交集)。如果你只对一个任意项目感兴趣(最容易,第一个),那么你根本不需要列表理解:
present [] _ = Nothing
present (x:xs) ys | x `elem` ys = Just x
| otherwise = present xs ys
答案 1 :(得分:1)
我猜你正在为课程做这件事,你不能使用标准库。
但在现实世界中,您通常需要某种“set”对象,例如Haskell标准库的Data.Set.Set。
import qualified Data.Set as S
commonElems :: (Ord a) => [a] -> [a] -> [a]
commonElems firstList = filter (\ elem -> S.member elem set)
where
set = S.fromList firstList
main :: IO ()
main = print $ commonElems [1, 2, 3, 55] [55, 3, 4, 5]
--[55,3]
(如果您只想要第一个公共元素,那么函数head
也可以。)