2014-11-22 165 views
1
element1 :: [a] -> [a] -> [a] 
    element1 [] [] = [] 
    element1 [] _ = [] 
    element1 _ [] = [] 

    element1 (h1:t1) (h2:t2) = if 

我被卡住,不知道如何从这里出发,我要检查两个列表,并返回这是两个列表中的第一个元素比较两个列表,并返回在两个列表的第一个元素

+0

你对你的方式;你需要返回'h1'和'h2'作为列表。 – Sibi 2014-11-22 00:12:27

+2

你想从Data.List'交叉',它看起来像? – Ingo 2014-11-22 00:49:07

回答

0

目前还不清楚,如果他们应该在相同的位置或什么。假设是:

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] 
+0

返回两个列表中的第一个元素,但它们不必位于这两个列表中的相同位置。 – theBean 2014-11-22 00:25:46

+0

@theBean,那么“第一个”是什么意思?第一个索引应该最小化吗?还是第二?或者他们的总和? – user3237465 2014-11-22 00:29:22

+1

'f [1,2] [2,1]'应该返回什么? – jamshidh 2014-11-22 00:46:22

1

您可以定义一个辅助谓词如果一个元素,检查在列表中(这已经在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]