2012-10-06 129 views
7

如何映射函數以在列表內的列表上操作? 以下是我正在試圖做的一個例子,但我只是作爲一個普遍問題提出問題。提前致謝!Haskell:將函數映射到列表中

現在,我試圖將函數映射到一個列表的每個列表上(由itrCol xs返回)。

evalChange xs = map change $ itrCol xs 

其中itrCol返回列表的列表,其中每個包含列表是列。

itrCol xs = [getCol x xs | x <- (take (width xs) (iterate (\x -> (x + 1)*1) 0))] 

getCol名單列給列索引

getCol :: Int -> [t] -> [t] 

和變化的列表:

change []  = [] 
change [x] = [x] 
change [x,y] = [x,y] 
change (x:y:z:ws) | x == y && y == z = 0 : y*(-1) : 0 : change ws 
change (x:xs) = x : change xs 
+0

不要忘記接受你的問題的答案=)(通過點擊答案上的綠色檢查圖標) –

+0

你在這裏列出的代碼是否給你任何錯誤信息?如果是這樣,他們是什麼?如果不是,那你到底在問什麼?我看到的唯一錯誤是,當你可能意味着'length'時,你使用了'width'? –

回答

6

可以只使用鑽營和另一個調用映射。

map (map change) $ itrCol xs 

要了解更多關於柯里看看那個chapter in Learn You A Haskell,一個偉大的初學者的書哈斯克爾。

+0

感謝您的回覆!我對currying很陌生,但是從我的研究來看,它正在改變函數所需的參數數量。 – user1670032

+0

我讀過的最好的解釋是[Learn You Haskell](http://learnyouahaskell.com/higher-order-functions#curried-functions)。你真的應該閱讀這本書,不會找到更好的! –

+1

謝謝!這是我的第一個函數式編程語言,與我習慣的命令式語言完全不同。我一定會研究這個! – user1670032

2

map(和fmap更重要的)主要舉起的函數,在列表中的工作,給你一個新的功能:(我加了多餘的括號,以使其更清晰)

map :: (a -> b) -> ([a] -> [b]) 

如果你映射的是第二個功能([a] -> [b])你會得到關於列表的列表工作的功能:

evalChange xs = map (map change) $ itrCol xs 

(如果這是不是你就想,那麼請註明)

+0

謝謝你的迴應!出於某種原因,這給了我一個錯誤。我試圖包含map的函數類型,但它仍然給我一個錯誤。我不確定如何將GHC中的錯誤複製到此處? – user1670032

+0

@ user1670032將其作爲編輯複製並粘貼到答案中。如果你不知道如何截圖。 – Pubby

+2

@ user1670032如果您在Windows中使用ghci,您需要點擊左上角的圖標,然後從菜單中選擇「編輯 - >標記」。現在突出顯示您想要複製的內容,然後按下Enter鍵。從那裏,只要你想要的地方照常粘貼。 –

11

看看這個!

map   :: (a -> b) -> [a] -> [b] 
(map.map)  :: (a -> b) -> [[a]] -> [[b]] 
(map.map.map) :: (a -> b) -> [[[a]]] -> [[[b]]] 

+0

@AndrewC,是的,這不是一個教學有用的答案,如果我沒有寫出答案,我可能不會很喜歡它...... – luqui

1

map類型簽名是:

map :: (a -> b) -> [a] -> [b] 

change爲一點合理的類型的簽名是:

change :: [Integer] -> [Integer] 

現在mapa期望的功能b作爲其第一個論點。如果我們給它change,從[Integer][Integer],然後​​和b = [Integer]的函數。

map change :: [[Integer]] -> [[Integer]] 

現在,如果從iterCol xs產生的列表中理解供應[[Integer]],那麼我們就可以應用到map change

map change (itrCol xs) :: [[Integer]] 

這一切看起來好像沒什麼問題。它的工作原理是因爲map是多態的。如果你給它一個把A變成B的函數,那麼它會給你一個函數,把列表中的A變成列表B。 A和B的含義並不重要,正如你在這裏看到的,它們甚至可以是自己的列表!