2012-07-16 104 views
2

排序元組的排列在Haskell我寫了代碼進行排序元組列表的指數我嘗試使用地圖bubblesort() 避免使用通過索引

 bubblesort::(Ord t) => [t]->[t] 
    bubblesort[x,y,z,xs]= 
       if x<y then x : map bubblesort [y,z,xs] 
         else y : map bubblesort [x,z,xs] 

,但它給我一個錯誤即:

 
ERROR line 20 - Type error in list 
*** Expression  : [y,xs] 
*** Term   : xs 
*** Type   : [a] 
*** Does not match : a 
*** Because  : unification would give infinite type 

*注請給我指令只

- 編譯器是在線編譯器

+1

什麼是你想要做什麼呢?只需排序一個列表,或排序一個元組? – NominSim 2012-07-16 17:44:09

回答

1

您遇到的主要問題是,我看到初學者使所有的時間。你正在使用一個列表,所以你已經決定你必須使用方括號。你真正需要的是一樣的東西:

bubblesort (x:y:xs) = 
    if x < y 
     then x : bubblesort (y:xs) 
     else y : bubblesort (x:xs) 

當你使用類似

foo [a,b,c] = … 

你明確的圖案,正好三個元素的列表匹配。如果您使用

foo (a:b:c:xs) = … 

那麼你就明確地列表匹配與至少三個要素,其中第一個被綁定到名字,第二個B,第三c和的休息列表(不管多長時間)稱爲xs。

我希望幫助它清除掉。這是一個非常常見的錯誤。

+1

這確實解決了他的一部分問題,但是您還需要''bubblesort a:[]'和'bubblesort []'的遞歸基礎案例。 – eternalmatt 2012-07-18 12:36:37

+0

@eternalmatt對,我不想爲他們做所有的功課=) – Axman6 2012-07-18 12:50:06

+0

我也沒有,哈哈。 – eternalmatt 2012-07-18 12:59:31

2

我不知道完整的解決方案,但bubblesort期望[t],但bubblesort [x,z,xs]將是[[t]] -> [[t]]的函數。因此,每一次,類型都會被另一個包裹[]

此外,您不需要做map bubblesort。嘗試記住map函數完全不知道爲什麼這沒有意義。

+0

感謝ü我現在知道如何解決它 – 2012-07-16 18:18:35

+0

很高興我能幫助沒有給予太多了:) – eternalmatt 2012-07-16 18:20:03

+0

我不認爲這在所有回答的現實問題。看到我的評論下面我相信解決問題。 – Axman6 2012-07-18 12:30:58

-1

感謝名單alote etemalmatt這個我slve爲我自己的問題

bubbleSort::(Ord t) => [t]->[t] 
    bubbleSort[x,y,z,xs]= 
       if x<y then x : [y,z,xs] 
         else y : [x,z,xs] 
    superBubble::(Ord t) => [[t]]->[[t]] 
    superBubble a=map bubbleSort a 

我的問題是使用map與遞歸應用到所有的元素,所以我的解決方法是使它與一個元素的工作,你在看功能bubbleSort()現在它固定

+0

這隻適用於四元素列表,這可能不是你想要的,但它越來越接近。你可能想在IRC頻道上詢問這個問題,這樣你就可以和某個人一起來回去,按照你的意願逐步完成任務。 – MatrixFrog 2012-07-17 06:25:32

+0

謝謝你的幫助,但什麼是IRC頻道? – 2012-07-17 06:40:12

+0

Freenode上的#haskell IRC頻道。請參閱http://stackoverflow.com/tags/haskell/info以獲得關於這個(和其他幾個Haskell資源)的更多信息。 – MatrixFrog 2012-07-17 17:25:18