2014-11-22 256 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]