2010-05-15 57 views
1

我有作業,我要更新一個列表使用一個函數,該函數接受兩個元素並返回函數中給出的第一個元素的一部分的值。因此,需要通過遍歷每個元素來更新整個列表,並通過針對列表中的所有其他元素(包括它自己)應用該函數來更新其值。正在更新列表元素,Haskell

到目前爲止,我一直試圖首先映射列表(以便每個元素完成相同),然後通過再次映射指定元素的值來專門更新每個元素值,但是試圖僅映射具體的價值通過:函數,特定元素和整個列表,我不斷收到抱怨,我推斷從'地圖函數p @列表列表'中創建的值列表,而不是簡單地給p @列表中的值。 這裏是什麼,我一直在試圖實現一個樣本:

res :: X -> X -> Z -- function given 

myf :: [X] -> [X] -- Here is my function 
myf ps = map newf ps 
    where 
    newf [email protected](X oldz) = X newz 
    newz = map (res p) ps 

這是正確的方法來嘗試更新對整個列表本身的清單?

編輯:拼寫錯誤和grammar-上也沒有把功課標籤上

+0

你可以給出你介紹的方法的代碼示例嗎?您可能還想添加作業標籤。 – 2010-05-15 02:23:15

+3

你的示例代碼沒有多大意義 - '''不在'newz'的範圍內,'newf'不使用它的參數,你沒有定義'res'或'X'和' Z'數據類型,除此之外,我甚至無法弄清楚你想要做什麼。 – 2010-05-15 04:02:05

回答

3

我的道歉,這是正確的方法來嘗試更新對整個列表本身的清單?

我不確定代碼對於任何任務是否正確。 看起來你假設[email protected](X oldz)從構造函數X oldz的列表中取出元素並將其命名爲p。但是......

您需要描述在應用map (res p)後如何改變列表的行爲。 如果所有的「轉變」,名單應該只根據列表的初始值進行,並從第一個元素,以適用於持續:

myf ps = (buildPlan ps) ps where 
    buildPlan [] = id 
    buildPlan (x:xs) = map (res x) . buildPlan xs 

有些人可能更喜歡:

myf ps = changesPlan ps where 
    change x = map (res x) 
    changesPlan = foldr (.) id (map change ps) 

如果您「轉變」列表(同時通過列表走在非FUNC語言更改即使是那些將在接下來的迭代中採取的所有元素)應該從以前map (res x)變化:

myf ps0 = rebuildFrom 0 ps0 where 
    rebuildFrom n ps | n >= length ps = ps 
    rebuildFrom n ps = rebuildFrom (n+1) ps' where 
     x = ps !! n 
     ps' = map (res x) ps