2012-03-17 41 views
-1

我目前正在爲我在奧地利的學習寫作我的學士CS論文。在haskell中模擬for循環

我使用的編程語言是Haskell。

現在,我試圖找到一種方法來解決我的下列問題: 我有一個元組列表,可以說[(1,2),(2,3)]。從元組的該名單,我現在想挑選出每個元組,然後做它的操作: Map.insert (1,2) XXX ftable 其中 (1,2)是列表的第一個元素和XXX一定的價值和ftable是我的地圖。

如何通過該列表「迭代」並繼續執行該操作,將我的列表的「第n」元素插入到我的地圖中?

我想我只是太熟悉編程必要,我沒有找到一種方法來解決在Haskell。

+0

我不確定你想要什麼。摺疊? 'foldl'insertIt映射元組? – 2012-03-17 16:16:07

+8

Haskell不模擬循環。 For循環模擬Haskell。 – 2012-03-17 18:04:32

回答

3

想想你的循環在做什麼。

  • 如果將每個列表元素,然後使用map(或concatMap
  • 如果過濾掉一些列表中要素的,然後使用filter
  • 如果它降低了列表的摘要值,使用摺疊(例如foldlfoldr;更具體的褶皺sumand等)
  • 或者如果它做上述的一些組合中,使用的上述功能的組合

在你的情況下,我並不完全確定你想要什麼,但我想你最終只需要一個Map,所以你想摺疊你的列表。也許取決於效果可以選擇像

foldl (\oldMap key -> Map.insert key xxx oldMap) ftable yourListOfTuples 
1

您有幾種選擇,反覆列表,每一個你正在尋找:

  • folds,他們是上列出了許多有用的計算。他們也可能是你要找的東西,但我不明白你的問題是你的具體問題。
  • map,它在輸入列表的每個元素上應用相同(給定)函數,返回結果列表。也有variants that works in monadic computations
  • 或者,如果它最適合您的需求,您可以隨時編寫自己的tail recursive函數:haskell將像循環一樣對待它們,而不消耗堆(但請參閱參考鏈接以獲得對該技術的很好解釋)。

最後,無論您使用哪種函數或技術,它都將基於遞歸,因爲函數式語言如Haskell不會以您習慣的形式承認for-loops。

5

這裏並不完全清楚你的意思。假設元組是爲了表示映射中的鍵,並且XXX是附加到特定鍵上的某個值是否正確?您想要與列表中提供的給定密鑰相匹配的所有值?在這種情況下,您可以輕鬆地使用fromList功能Data.Map

keys = [(1,2),(2,3),(7,9)] 
values = ["A","B","C"] 

map = Data.Map.fromList $ zip keys values 
1

大廈關閉hakoja的建議下...

這是可能的,XXX在這一點上是1)不斷爲每個鍵,或2)基於密鑰的一些功能,或3)以某種方式與密鑰並行地定義。

1)恆定XXX每鍵

keys = [(1,2),(2,3),(7,9)] 
xxx = "A" 

ftable = Data.Map.fromList $ zip keys (repeat xxx) 

2)函數產生基於鍵

keys = [(1,2),(2,3),(7,9)] 
f = ... 

ftable = Data.Map.fromList $ zip keys (map f keys) 

3)某某並聯定義的值:使用hakoja的建議