我正在用Haskell處理小程序。 也許答案很簡單,但我試着得不到結果。 所以我在程序的部分之一是列表Haskell比較元素[[]]
first = [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43) ..]
,並根據該列表我要做出新的一個與元素是在()=
result = [3,7,9,43, ..]
如果相等你有時間和耐心,我將不勝感激
我正在用Haskell處理小程序。 也許答案很簡單,但我試着得不到結果。 所以我在程序的部分之一是列表Haskell比較元素[[]]
first = [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43) ..]
,並根據該列表我要做出新的一個與元素是在()=
result = [3,7,9,43, ..]
如果相等你有時間和耐心,我將不勝感激
即使你似乎沒有做出最小的努力來自己解決這個問題,我會給你答案,因爲它是如此微不足道,因爲Haskell是一門偉大的語言。
與此簽名創建一個函數:
findIdentical :: [(Int, Int)] -> [Int]
它需要一個元組列表,並返回整數的列表。
這樣實現:
findIdentical [] = []
findIdentical ((a,b) : xs)
| a == b = a : (findIdentical xs)
| otherwise = findIdentical xs
正如你所看到的,findIdentical
是一個遞歸函數,兩個項目之間的平等比較的元組,然後如果發現平等把它添加到結果列表。
你可以做這個例如列表理解。我們迭代遍歷first
中的每個元組f,s)
,所以我們在列表理解的右側編寫(f,s) <- first
,並且需要對f
和s
相等的事實進行過濾,所以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 ]
一個簡單的方法來做到這一點是使用前奏的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]
如果你表現出一定的attemt,我們將不勝感激。 http://idownvotedbecau.se/noattempt/ –
那麼你在哪裏堅持你的嘗試?請注意,該網站適合回答特定問題。像「這是我的任務,幫助我,我不知道從哪裏開始」這樣的請求被忽視了。 –
我正在嘗試像這樣'result = [x | x < - (head first),x fst == x scd]'帶元素並檢查語句,但它不起作用。我正在和[[]]一起工作,我得到了[],所以這是第一個問題,我認爲我試圖'迭代'的方法是錯誤的 – kefir