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