在Haskell阻止

时间:2018-02-23 16:48:25

标签: haskell

我正在尝试在Haskell中编写一个函数,它接受两个列表并返回两个共同的元素 我使用以下方法,但它给出了一个解析错误,并说要将<-语句放在do块中。如何在do块中实现条件?

我正在尝试:

present (xs)(ys) = concat[ x | x <- xs && x <-ys ]

2 个答案:

答案 0 :(得分:3)

<-并未说“xxs”;它说“从x”开始xs。它不是一个布尔表达式,您可以使用&&与其他人结合,但这是列表推导的部分语法。如果你想使用列表理解,它将是

present xs ys = [x | x <- xs, x `elem` ys]

您从xs获取每个元素,但只有在ys的元素中才使用它。您不需要concat

请注意,这需要{em> xsys共有的所有元素(即,它是设置的交集)。如果你只对一个任意项目感兴趣(最容易,第一个),那么你根本不需要列表理解:

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也可以。)