2013-09-27 24 views
1

我已經給出了一個任務,用於對列表中的哪個列表中的哪個 未包含在另一個列表中進行排序。將子列表分開的問題

在這種情況下,它是沒有銀行賬戶的NI號碼。

的類型如下:

type NI = Int 
    type Age = Int 
    type Balance = Int 
    type Person = (NI, Age, Balance) 
    type Bank = [Person] 
    type Market = [Bank] 
    type Pop = [NI] 

的bankFree功能如下:

bankFree :: Pop -> Market -> Pop 
    bankFree a b = filter (map op3 b) a 
     where 
      op3 [(x, y, z)] = x 

我完全難倒我從這裏去哪裏。我知道我將不得不在Pop列表上工作,以便從該列表中刪除地圖操作中的元素。我嘗試過適應notElem並執行一堆其他不同的測試,但沒有用。

將不勝感激任何幫助。

+0

確保你的'op3'正在做你期望的(它的類型是什麼?它會處理所有可能的輸入嗎?)。你是否熟悉[集合論](http://www.leda-tutorial.org/en/official/ch02s08s02.html)中的交集,聯合等概念?您可能會發現像[Data.Map](http://hackage.haskell.org/package/containers-0.5.3.1/docs/Data-Map.html)或Data.Set這樣的其他數據結構可能更適合並且已經提供您需要的功能 – jberryman

回答

2

編程的訣竅是弄清楚如何將複雜的問題分解爲簡單的問題。如果你以另一種方式實踐,獲得這種直覺可能會更容易 - 從解決方案到簡單問題,爲解決複雜問題構建解決方案。這樣,您可以感受到問題最爲有效的簡化方式。

這個問題很容易分解。讓我們從一個最簡單的問題開始,向上延伸:

  • 你可以解決這個問題,對於一個NI和一個人嗎?這是一個功能
  • 你可以擴展一個NI和許多人(一家銀行)的解決方案嗎?這是另一個功能 - 可能使用前一個功能
  • 您能擴展一個NI和許多銀行(一個市場)的解決方案嗎?又一個功能 - 可能使用前面的一個功能,你可以將這個解決方案應用到所有NI(一個Pop)嗎?還有一個功能 - 可能使用前一個功能

就是這樣。

+0

就是這樣。我簡單地分解了它並構建了一個搜索每個銀行並返回一個Bool的函數。從那裏我簡單地過濾了市場清單並得到了我的答案。非常感謝:)不能相信我忘了基本的編程哈哈 –