element1 :: [a] -> [a] -> [a]
element1 [] [] = []
element1 [] _ = []
element1 _ [] = []
element1 (h1:t1) (h2:t2) = if
我被卡住,不知道如何从这里出发,我要检查两个列表,并返回这是两个列表中的第一个元素比较两个列表,并返回在两个列表的第一个元素
element1 :: [a] -> [a] -> [a]
element1 [] [] = []
element1 [] _ = []
element1 _ [] = []
element1 (h1:t1) (h2:t2) = if
我被卡住,不知道如何从这里出发,我要检查两个列表,并返回这是两个列表中的第一个元素比较两个列表,并返回在两个列表的第一个元素
目前还不清楚,如果他们应该在相同的位置或什么。假设是:
f = ((head . concat) .) . zipWith (\x y -> [x | x == y])
或者扩展:
f xs ys = head $ concat $ zipWith (\x y -> [x | x == y]) xs ys
如果索引必须在第一个列表中是最小的:
f xs ys = head [x | x <- xs, x `elem` ys]
返回两个列表中的第一个元素,但它们不必位于这两个列表中的相同位置。 – theBean 2014-11-22 00:25:46
@theBean,那么“第一个”是什么意思?第一个索引应该最小化吗?还是第二?或者他们的总和? – user3237465 2014-11-22 00:29:22
'f [1,2] [2,1]'应该返回什么? – jamshidh 2014-11-22 00:46:22
您可以定义一个辅助谓词如果一个元素,检查在列表中(这已经在Data.List中实现)。然后在你的主函数中通过第一个列表进行递归。这是做到这一点的一种方法。
element1 :: (Eq a) => [a] -> [a] -> [a]
element1 [] _ = []
element1 _ [] = []
element1 (h:t) xs = if (isInList h xs)
then [h]
else element1 t xs
isInList :: (Eq a) => a -> [a] -> Bool
isInList _ [] = False
isInList e (x:xs) = if e == x
then True
else isInList e xs
一些输出:
element1 [1,2,3] [8,5,9,3] = [3]
element1 [1,2,3] [1,5,9,3] = [1]
element1 [1,2,3] [3,2,1] = [1]
你对你的方式;你需要返回'h1'和'h2'作为列表。 – Sibi 2014-11-22 00:12:27
你想从Data.List'交叉',它看起来像? – Ingo 2014-11-22 00:49:07