2017-12-18 216 views
0

我正在用Haskell處理小程序。 也許答案很簡單,但我試着得不到結果。 所以我在程序的部分之一是列表Haskell比較元素[[]]

first = [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43) ..] 

,並根據該列表我要做出新的一個與元素是在()=

result = [3,7,9,43, ..]

如果相等你有時間和耐心,我將不勝感激

+3

如果你表現出一定的attemt,我們將不勝感激。 http://idownvotedbecau.se/noattempt/ –

+3

那麼你在哪裏堅持你的嘗試?請注意,該網站適合回答特定問題。像「這是我的任務,幫助我,我不知道從哪裏開始」這樣的請求被忽視了。 –

+0

我正在嘗試像這樣'result = [x | x < - (head first),x fst == x scd]'帶元素並檢查語句,但它不起作用。我正在和[[]]一起工作,我得到了[],所以這是第一個問題,我認爲我試圖'迭代'的方法是錯誤的 – kefir

回答

3

即使你似乎沒有做出最小的努力來自己解決這個問題,我會給你答案,因爲它是如此微不足道,因爲Haskell是一門偉大的語言。

與此簽名創建一個函數:

findIdentical :: [(Int, Int)] -> [Int] 

它需要一個元組列表,並返回整數的列表。

這樣實現:

findIdentical [] = [] 
findIdentical ((a,b) : xs) 
    | a == b = a : (findIdentical xs) 
    | otherwise = findIdentical xs 

正如你所看到的,findIdentical是一個遞歸函數,兩個項目之間的平等比較的元組,然後如果發現平等把它添加到結果列表。

+0

'findIdentical = filter(uncurry(==))。 map fst' –

+0

您的觀點是什麼,一個問題有無數可能的解決方案?說實話,我更喜歡我的功能,因爲它非常明確,而你在一行中使用5個函數。它確實減少了50%的代碼行,這很好。 – Glubus

+0

@SebastianRedl您的解決方案甚至不會檢查 – gallais

1

你可以做這個例如列表理解。我們迭代遍歷first中的每個元組f,s),所以我們在列表理解的右側編寫(f,s) <- first,並且需要對fs相等的事實進行過濾,所以f == s。在這種情況下,我們將f(或s)添加到result。所以:

result = [ f | (f,s) <- first, f == s ] 

我們可以把它變成是作爲輸入的2元組[(a,a)]名單,而這兩個元素進行比較,並返回一個列表[a]功能:

f :: Eq a => [(a,a)] -> [a] 
f dat = [f | (f,s) <- dat, f == s ] 
1

一個簡單的方法來做到這一點是使用前奏的filter功能,它具有類型定義:

filter :: (a -> Bool) -> [a] -> [a] 

所有你需要做的是如何篩選列表中的元素供應謂語和要過濾的列表。您可以輕鬆地做到以下這一點:

filterList :: (Eq a) => [(a, a)] -> [a] 
filterList xs = [x | (x, y) <- filter (\(a, b) -> a == b) xs] 

預期其行爲:

*Main> filterList [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43)] 
[3,7,9,43]